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

Откуда:
Сообщений: 146
Подскажите, вот есть запрос
SELECT t.*
              FROM 
               ( select CustomerName,[ItemRelation], [DocumentNum], [DocumentYear],
               CustomerType FROM  [Action].dbo.mytab1
               WHERE Dt > 30.07.2017  and  [IsPromo] = 1        
               group by CustomerName,[ItemRelation],
               [DocumentNum], [DocumentYear],CustomerType having count(*) >=5 ) as x
               left outer join [Action].dbo.mytab1 as t on  
               x.ItemRelation = t.[ItemRelation] and x.[DocumentNum] = t.[DocumentNum] 
               and x.[DocumentYear] = t.[DocumentYear]
               and x.[CustomerName] = t.[CustomerName]
               and x.[CustomerType] = t.[CustomerType]
               WHERE t.Dt > 30.07.2017


Этот запрос должен возвращать данные с 30.07.2017 (это дата, когда новые данные были загружены в sql). Но в последний раз, когда этот запрос работал, было 20.06.18. Существует столбец DocumentNum.
Как сделать, чтобы запрос возвращал только те данные, в которых DocumentNum уникален?

Что это значит? в последний день, когда запрос работал, был 20.06.18, но в 30.07.2017 появились новые данные, они могут быть датирован примерно так:
+ Заголовок
dt documentnum
07.06.2018 1111
08.06.2018 1111
09.06.2018 1111
10.06.2018 1111
11.06.2018 1111
12.06.2018 1111
13.06.2018 1111
14.06.2018 1111
15.06.2018 1111
16.06.2018 1111
17.06.2018 1111
18.06.2018 1111
19.06.2018 1111
20.06.2018 1111
21.06.2018 1111
22.06.2018 1111
23.06.2018 1111
24.06.2018 1111
25.06.2018 1111
26.06.2018 1111
27.06.2018 1111
28.06.2018 1111
29.06.2018 1111
30.06.2018 1111
01.07.2018 1111
02.07.2018 1111
03.07.2018 1111


Конечно, все строки, которые меньше 30.07.2018, не вернутся, но documentnum = 1111 это уникальный documentnum, он не был загружен, когда запрос работал 20.06.18

и запрос (> 30.07.2018) возвращает только эти строки
30.06.2018 1111
01.07.2018 1111
02.07.2018 1111
03.07.2018 1111

Но мне нужны все данные для этого уникального документа. Как сделать чтобы sql возвращал только и только уникальный documentnum, даже если они имеют дату меньше, чем указано в запросе. (часть его данных менее 30.07.2018).

Понять что documentnum новый легко, он есть в новом наборе данных, но нужно вернуть и то чтобы до 30.07.2018 , когда он еще не был загружен. Т.е. вернуть его со всеми данными.
6 авг 18, 16:42    [21631805]     Ответить | Цитировать Сообщить модератору
 Re: Возвращать только уникальные документы в SQL учитывает время  [new]
aleks222
Member

Откуда:
Сообщений: 952
SELECT t.*
              FROM 
               ( select CustomerName,[ItemRelation], [DocumentNum], [DocumentYear],
               CustomerType FROM  [Action].dbo.mytab1
               WHERE Dt > 30.07.2017  and  [IsPromo] = 1        
               group by CustomerName,[ItemRelation],
               [DocumentNum], [DocumentYear],CustomerType having count(*) >=5 ) as x
               left outer join [Action].dbo.mytab1 as t on  
               x.ItemRelation = t.[ItemRelation] and x.[DocumentNum] = t.[DocumentNum] 
               and x.[DocumentYear] = t.[DocumentYear]
               and x.[CustomerName] = t.[CustomerName]
               and x.[CustomerType] = t.[CustomerType]
--               WHERE t.Dt > 30.07.2017
6 авг 18, 18:09    [21631949]     Ответить | Цитировать Сообщить модератору
 Re: Возвращать только уникальные документы в SQL учитывает время  [new]
Kontox
Member

Откуда:
Сообщений: 146
не совсем так.
нужно нечто вроде
SELECT DISTINCT DocumentNum
              FROM 
               ( select CustomerName,[ItemRelation], [DocumentNum], [DocumentYear],
               CustomerType FROM  [Action].dbo.mytab1
               WHERE Dt > 30.07.2017  and  [IsPromo] = 1        
               group by CustomerName,[ItemRelation],
               [DocumentNum], [DocumentYear],CustomerType having count(*) >=5 ) as x
 WHERE NOT EXISTS
(
SELECT 1
FROM  [Action].dbo.mytab1 as t 
where
               x.ItemRelation = t.[ItemRelation] and x.[DocumentNum] = t.[DocumentNum] 
               and x.[DocumentYear] = t.[DocumentYear]
               and x.[CustomerName] = t.[CustomerName]
               and x.[CustomerType] = t.[CustomerType]
AND t.Dt < 30.07.2017
)


но только мне возвращаются только один столбец, с уникальными [DocumentNum]
DocumentNum
0000000002
0000000004
0000000005
0000000007
0000000008
0000000009
0000000012
0000000013
0000000014
0000000015
0000000016
0000000017
0000000018
0000000019
0000000020
а мне не только уникальные [DocumentNum] нужны, но и данные по ним для колонок
[Dt]
,[CustomerName]
,[PayerName]
,[ItemRelation]
,[ProductName]
,[SaleCount]

,[DocumentYear]
,[IsPromo]
,[CustomerType]
6 авг 18, 18:44    [21631990]     Ответить | Цитировать Сообщить модератору
 Re: Возвращать только уникальные документы в SQL учитывает время  [new]
Щукина Анна
Member

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

Вас трудно понять, но, возможно, вы ищете это....
7 авг 18, 06:28    [21632351]     Ответить | Цитировать Сообщить модератору
 Re: Возвращать только уникальные документы в SQL учитывает время  [new]
Kontox
Member

Откуда:
Сообщений: 146
Разобрался, я ж не только спрашиваю, но попутно сам читаю матчасть
;with cte as (
SELECT DISTINCT DocumentNum
              FROM 
               ( select CustomerName,[ItemRelation], [DocumentNum], [DocumentYear],
               CustomerType FROM  [Action].dbo.mytab1
               WHERE Dt > '20180627'  and  [IsPromo] = 1        
               group by CustomerName,[ItemRelation],
               [DocumentNum], [DocumentYear],CustomerType having count(*) >=5 ) as x
WHERE [DocumentNum]  in 
(
SELECT t.[DocumentNum]
FROM  [Action].dbo.mytab1 as t 
where
               x.ItemRelation = t.[ItemRelation] and x.[DocumentNum] = t.[DocumentNum] 
               and x.[DocumentYear] = t.[DocumentYear]
               and x.[CustomerName] = t.[CustomerName]
               and x.[CustomerType] = t.[CustomerType]
AND t.Dt < '20180627'))

select a.[DocumentNum],b.[Dt],b.[CustomerName],b.[PayerName],b.[ItemRelation],b.[ProductName],b.[SaleCount],b.[DocumentYear],b.[IsPromo],b.[CustomerType] 
from cte a join [Action].dbo.mytab1 b on a.DocumentNum=b.DocumentNum
where  b.Dt > '20180627' 
order by  a.[DocumentNum]
7 авг 18, 12:51    [21632770]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить