Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
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 появились новые данные, они могут быть датирован примерно так:
Конечно, все строки, которые меньше 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] Ответить | Цитировать Сообщить модератору |
aleks222 Member [заблокирован] Откуда: Сообщений: 1243 |
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] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
Щукина Анна Member Откуда: Сообщений: 1507 |
Kontox, Вас трудно понять, но, возможно, вы ищете это.... |
7 авг 18, 06:28 [21632351] Ответить | Цитировать Сообщить модератору |
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 | ![]() |