Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Сделать выборку пропущенных строк в таблице  [new]
Дмитрий855
Member

Откуда:
Сообщений: 9
Привет всем!
Нужна помощь. Необходимо сделать выборку недостающих (пропущенных) строк в таблице.
Например имеем таблицу:
IDReportStat
1
2
3
6
18
22
24

Пропущенные строки нужно вывести отдельно.
25 мар 14, 13:26    [15783179]     Ответить | Цитировать Сообщить модератору
 Re: Сделать выборку пропущенных строк в таблице  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
select
  *
from [Таблица без пропущенных строк] a
where 
  not exists ( select * from [имеем таблицу] b on a.IDReportStat = b.IDReportStat  )
25 мар 14, 13:27    [15783199]     Ответить | Цитировать Сообщить модератору
 Re: Сделать выборку пропущенных строк в таблице  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
https://www.sql.ru/forum/actualsearch.aspx?search=????? ?????&sin=0&bid=1&a=&ma=0&dt=-1&s=1&so=1
25 мар 14, 13:28    [15783200]     Ответить | Цитировать Сообщить модератору
 Re: Сделать выборку пропущенных строк в таблице  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8815
Для практических целей достаточно найти первый свободный номер. В этом случае могут помочь аналитические функции. LEAD(), в частности.
25 мар 14, 14:02    [15783470]     Ответить | Цитировать Сообщить модератору
 Re: Сделать выборку пропущенных строк в таблице  [new]
Дмитрий855
Member

Откуда:
Сообщений: 9
Гавриленко Сергей Алексеевич,
не работает
25 мар 14, 14:46    [15783790]     Ответить | Цитировать Сообщить модератору
 Re: Сделать выборку пропущенных строк в таблице  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Дмитрий855
Гавриленко Сергей Алексеевич,
не работает
Ошибка в 17й строке.
25 мар 14, 14:49    [15783803]     Ответить | Цитировать Сообщить модератору
 Re: Сделать выборку пропущенных строк в таблице  [new]
xenix
Guest
А если как-то так
--таблица, в которой ищем пропуски
DECLARE @InTest TABLE(FLAG INT);

INSERT @InTest(FLAG)
VALUES(1),(2),(3),(5),(6),(8),(10);

--эталонная без пропусков
DECLARE @InEthalon TABLE(ETHALON INT);
DECLARE @InI INT;
SELECT @INI=0;
WHILE(@InI<=20)
 BEGIN
  INSERT @InEthalon(ETHALON)VALUES(@InI);
  SELECT @InI=@InI+1;
 END

SELECT T.FLAG,E.ETHALON FROM @InEthalon E
LEFT JOIN @InTest T ON T.FLAG=E.ETHALON
WHERE T.FLAG IS NULL
25 мар 14, 14:54    [15783848]     Ответить | Цитировать Сообщить модератору
 Re: Сделать выборку пропущенных строк в таблице  [new]
Дмитрий855
Member

Откуда:
Сообщений: 9
xenix,

нет эталонной таблицы
25 мар 14, 15:55    [15784437]     Ответить | Цитировать Сообщить модератору
 Re: Сделать выборку пропущенных строк в таблице  [new]
Glory
Member

Откуда:
Сообщений: 104751
Дмитрий855
нет эталонной таблицы

А как вы себе представляете выборку данных, которых не существует на сервере ?
По принципу - отсутствующие, встаньте ?
25 мар 14, 15:57    [15784469]     Ответить | Цитировать Сообщить модератору
 Re: Сделать выборку пропущенных строк в таблице  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Дмитрий855
xenix,

нет эталонной таблицы
Ну так создайте.
25 мар 14, 16:01    [15784498]     Ответить | Цитировать Сообщить модератору
 Re: Сделать выборку пропущенных строк в таблице  [new]
_djХомяГ
Guest
Не хотите делать эталонную таблицу натуральных чисел ипользуйте (если конечно последовательность удовлетворяет)
select Number from master..spt_values where Type='P'
25 мар 14, 16:02    [15784500]     Ответить | Цитировать Сообщить модератору
 Re: Сделать выборку пропущенных строк в таблице  [new]
Дмитрий855
Member

Откуда:
Сообщений: 9
Glory, нет эталонной таблицы на сервере
25 мар 14, 16:02    [15784505]     Ответить | Цитировать Сообщить модератору
 Re: Сделать выборку пропущенных строк в таблице  [new]
xenix
Guest
автор
нет эталонной таблицы на сервере

Вам же сказали. Нет - создайте
25 мар 14, 16:04    [15784519]     Ответить | Цитировать Сообщить модератору
 Re: Сделать выборку пропущенных строк в таблице  [new]
Glory
Member

Откуда:
Сообщений: 104751
Дмитрий855
Glory, нет эталонной таблицы на сервере

Все просто
Нет данных - нет результата
Есть данные - есть результат
25 мар 14, 16:04    [15784520]     Ответить | Цитировать Сообщить модератору
 Re: Сделать выборку пропущенных строк в таблице  [new]
Chippollino.01
Member

Откуда: изнемагаю
Сообщений: 35527
в качестве упражнения на изврат применим рекурсию

WITH T AS( SELECT * FROM (VALUES (1),(2),(3),(6),(18),(22),(24)) TT(IDReportStat)),
M AS (SELECT MAX(IDReportStat) MT FROM T),
TR(IDReportStat) AS (
SELECT T1.IDReportStat+1 IDReportStat FROM T T1 LEFT OUTER JOIN T T2 ON T1.IDReportStat+1=T2.IDReportStat 
WHERE T1.IDReportStat < (SELECT MT FROM M) AND T2.IDReportStat IS NULL
UNION ALL
SELECT TR.IDReportStat+1 IDReportStat FROM TR
WHERE TR.IDReportStat < (SELECT MT FROM M) AND TR.IDReportStat+1 NOT IN (SELECT IDReportStat FROM T)
)
SELECT * FROM TR ORDER BY 1
25 мар 14, 16:42    [15784817]     Ответить | Цитировать Сообщить модератору
 Re: Сделать выборку пропущенных строк в таблице  [new]
Добрый Э - Эх
Guest
Дмитрий855,

разбей задачу на два этапа:
1) Поиск начал-кончал дырок
2) Генерирование данных в рамках полученных на первом этапе дыр...
25 мар 14, 16:53    [15784914]     Ответить | Цитировать Сообщить модератору
 Re: Сделать выборку пропущенных строк в таблице  [new]
o-o
Guest
оспаде.
ТС даже не понимает, что есть "эталонная таблица", так ему еще и рекурсию

declare @t table (IDReportStat int)
insert into @t values
(1),
(2),
(3),
(6),
(18),
(22),
(24)

;with cte as(
select number as n
from master..spt_values
where type = 'p' and number between 1 and (select max(IDReportStat) from @t))

select
  *
from cte a
where 
  not exists ( select * from @t b where b.IDReportStat = a.n )


и то уже предвижу, что за этим последует :(
25 мар 14, 16:53    [15784924]     Ответить | Цитировать Сообщить модератору
 Re: Сделать выборку пропущенных строк в таблице  [new]
_djХомяГ
Guest
Chippollino.01
в качестве упражнения на изврат применим рекурсию

WITH T AS( SELECT * FROM (VALUES (1),(2),(3),(6),(18),(22),(24)) TT(IDReportStat)),
M AS (SELECT MAX(IDReportStat) MT FROM T),
TR(IDReportStat) AS (
SELECT T1.IDReportStat+1 IDReportStat FROM T T1 LEFT OUTER JOIN T T2 ON T1.IDReportStat+1=T2.IDReportStat 
WHERE T1.IDReportStat < (SELECT MT FROM M) AND T2.IDReportStat IS NULL
UNION ALL
SELECT TR.IDReportStat+1 IDReportStat FROM TR
WHERE TR.IDReportStat < (SELECT MT FROM M) AND TR.IDReportStat+1 NOT IN (SELECT IDReportStat FROM T)
)
SELECT * FROM TR ORDER BY 1

Реукрсией можно заполнить таблицу натуральнызх чисел а далее работать с not exists например как указывали выше
declare @maxval int 
select @maxval=100500
;with cte
as
(
   select 1 as NUM
   union all
   select NUM+1
   from CTE
   where NUM<@maxval
)
insert into [Таблица]
select Num 
from cte
OPTION (MAXRECURSION 0);
25 мар 14, 16:56    [15784946]     Ответить | Цитировать Сообщить модератору
 Re: Сделать выборку пропущенных строк в таблице  [new]
o-o
Guest
какой день рекурсивный :)

set nocount on;
if object_id('dbo.nums', 'u') is not null drop table dbo.nums;
create table dbo.nums(n int not null primary key);

declare @i as int = 1;
begin tran
  while @i <= 100000
  begin
    insert into dbo.nums values(@i);
    set @i = @i + 1;
  end
commit tran
set nocount off;
25 мар 14, 17:14    [15785081]     Ответить | Цитировать Сообщить модератору
 Re: Сделать выборку пропущенных строк в таблице  [new]
Дмитрий855
Member

Откуда:
Сообщений: 9
_djХомяГ,

SELECT IDReportStat + 1 AS ID
FROM _Reports
WHERE (IDReportStat NOT IN
(SELECT IDReportStat - 1 AS ID
FROM _Reports AS _Reports_1))
25 мар 14, 17:47    [15785276]     Ответить | Цитировать Сообщить модератору
 Re: Сделать выборку пропущенных строк в таблице  [new]
Дмитрий855
Member

Откуда:
Сообщений: 9
xenix,
снизу ответ
25 мар 14, 18:03    [15785378]     Ответить | Цитировать Сообщить модератору
 Re: Сделать выборку пропущенных строк в таблице  [new]
Glory
Member

Откуда:
Сообщений: 104751
Дмитрий855

SELECT IDReportStat + 1 AS ID
FROM _Reports
WHERE (IDReportStat NOT IN
(SELECT IDReportStat - 1 AS ID
FROM _Reports AS _Reports_1))

разве это запрос сделает "выборку недостающих (пропущенных) строк в таблице." ???
25 мар 14, 18:06    [15785399]     Ответить | Цитировать Сообщить модератору
 Re: Сделать выборку пропущенных строк в таблице  [new]
Дмитрий855
Member

Откуда:
Сообщений: 9
Glory,

да
ответ
16
24
35
119
25 мар 14, 18:13    [15785434]     Ответить | Цитировать Сообщить модератору
 Re: Сделать выборку пропущенных строк в таблице  [new]
Дмитрий855
Member

Откуда:
Сообщений: 9
Glory,
хотя бы айдишники
25 мар 14, 18:13    [15785441]     Ответить | Цитировать Сообщить модератору
 Re: Сделать выборку пропущенных строк в таблице  [new]
Дмитрий855
Member

Откуда:
Сообщений: 9
Glory,

...но видишь в чем незадача. У меня , например отсутствуют айдишники с 16-17 а он выдал только 16.
25 мар 14, 18:14    [15785451]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить