powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Возвращать только уникальные документы в SQL учитывает время
5 сообщений из 5, страница 1 из 1
Возвращать только уникальные документы в SQL учитывает время
    #39683830
Kontox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите, вот есть запрос
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
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 , когда он еще не был загружен. Т.е. вернуть его со всеми данными.
...
Рейтинг: 0 / 0
Возвращать только уникальные документы в SQL учитывает время
    #39683885
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
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
...
Рейтинг: 0 / 0
Возвращать только уникальные документы в SQL учитывает время
    #39683910
Kontox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
не совсем так.
нужно нечто вроде
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
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]
...
Рейтинг: 0 / 0
Возвращать только уникальные документы в SQL учитывает время
    #39684026
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kontox,

Вас трудно понять, но, возможно, вы ищете это ....
...
Рейтинг: 0 / 0
Возвращать только уникальные документы в SQL учитывает время
    #39684211
Kontox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Разобрался, я ж не только спрашиваю, но попутно сам читаю матчасть
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
;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]
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Возвращать только уникальные документы в SQL учитывает время
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]