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

Откуда:
Сообщений: 44
Добрый день
У меня есть таблица покупателей
Подскажите как выбрать покупателя ,который покупал два дня подряд

Покупательдата
Олег25.01.2000
Олег26.01.2000
Маша02.01.2001
Игорь03.01.2001
Маша03.01.2001

Получается запрос должен выбрать только машу и олега
15 ноя 16, 13:26    [19895551]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с date  [new]
Yagrus2
Member

Откуда: Москва
Сообщений: 902
LazzyMind,
А олег почему не подходит?
15 ноя 16, 13:29    [19895565]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с date  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5126
LazzyMind,

версия сервера какая?
15 ноя 16, 13:31    [19895580]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с date  [new]
Sybex
Member

Откуда: Moscow
Сообщений: 119
Например, так:
;with cte (customer, d)
as
(
    select N'Олег', convert(date, '2000-01-25', 126) union all
    select N'Олег', convert(date, '2000-01-26', 126) union all
    select N'Маша', convert(date, '2001-01-02', 126) union all
    select N'Игорь', convert(date, '2001-01-03', 126) union all
    select N'Маша', convert(date, '2001-01-03', 126)
)
select cte.customer
  from cte
 where exists(select null
                from cte c
               where cte.customer = c.customer and cte.d = dateadd(day, 1, c.d))
15 ноя 16, 13:38    [19895643]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с date  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
Sybex,
как только не извращаются :)
exists(select null
15 ноя 16, 13:45    [19895684]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с date  [new]
LazzyMind
Member

Откуда:
Сообщений: 44
Монжо ли как то без cte
15 ноя 16, 14:16    [19895981]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с date  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
LazzyMind
Монжо ли как то без cte

омг... там cte только для примера вашей таблицы
15 ноя 16, 14:19    [19895997]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с date  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4478
LazzyMind
Монжо ли как то без cte

cte тут только в качестве примера!
Вся фишка тут
 where cte.d = dateadd(day, 1, c.d) 

в совпадении соседних дат
15 ноя 16, 14:20    [19896004]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с date  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8839
TaPaK
Sybex,
как только не извращаются :)
exists(select null


Это совсем экзотика :)
15 ноя 16, 14:21    [19896010]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с date  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 942
А потом он спросит, а как сделать, если нужно 3 дня.
Может правда, в FAQ пора добавить ссылки на острова?
15 ноя 16, 14:22    [19896015]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с date  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4478
Руслан Дамирович
А потом он спросит, а как сделать, если нужно 3 дня.
Может правда, в FAQ пора добавить ссылки на острова?


declare @days int = 3;
...
where cte.d = dateadd(day, @days , c.d) 
15 ноя 16, 14:25    [19896033]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с date  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
SQL2008
Руслан Дамирович
А потом он спросит, а как сделать, если нужно 3 дня.
Может правда, в FAQ пора добавить ссылки на острова?


declare @days int = 3;
...
where cte.d = dateadd(day, @days , c.d) 

омг, лучше бы и не пытался
15 ноя 16, 14:28    [19896051]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с date  [new]
Верблюд
Member

Откуда: Яженичеловек!!!
Сообщений: 65007
WITH cte(customer, d) AS
	(
		SELECT	N'Олег', CONVERT(DATE, '2000-01-25', 126) UNION ALL
		SELECT	N'Олег', CONVERT(DATE, '2000-01-26', 126) UNION ALL
		SELECT	N'Маша', CONVERT(DATE, '2001-01-02', 126) UNION ALL
		SELECT	N'Игорь', CONVERT(DATE, '2001-01-03', 126) UNION ALL
		SELECT	N'Маша', CONVERT(DATE, '2001-01-03', 126)
	)
SELECT DISTINCT customer
FROM (SELECT *, DATEDIFF(dd, ROW_NUMBER() OVER(PARTITION BY customer ORDER BY d), d) x FROM cte) x
GROUP BY	customer,	x
HAVING COUNT(*) > 1
15 ноя 16, 14:49    [19896171]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с date  [new]
LazzyMind
Member

Откуда:
Сообщений: 44
Всем спасибо
15 ноя 16, 14:58    [19896240]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с date  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Владислав Колосов
TaPaK
Sybex,
как только не извращаются :)
exists(select null



Это совсем экзотика :)
Это совершенно нормально. Я, правда, предпочитаю *. Как и большинство.
15 ноя 16, 15:55    [19896602]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с date  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
iap
Владислав Колосов
пропущено...


Это совсем экзотика :)
Это совершенно нормально. Я, правда, предпочитаю *. Как и большинство.

никто и не говорит что это не нормально, экзотично подходит больше :)
15 ноя 16, 15:57    [19896614]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с date  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8839
Можно свои инициалы писать или название любимого кинофильма.
15 ноя 16, 16:52    [19896960]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с date  [new]
Bator
Member

Откуда: Порт пяти морей
Сообщений: 439
iap
Владислав Колосов
пропущено...


Это совсем экзотика :)
Это совершенно нормально. Я, правда, предпочитаю *. Как и большинство.

А я на автомате 1 ставлю. Хотя иногда вспоминаю, что это уже давно бессмысленно и ставлю таки *.
15 ноя 16, 16:53    [19896971]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с date  [new]
Strangers
Member [заблокирован]

Откуда: Україна
Сообщений: 2613
;WITH asd AS
	(
		SELECT	N'Олег' as customer, CONVERT(DATE, '2000-01-25', 126) as d UNION ALL
		SELECT	N'Олег', CONVERT(DATE, '2000-01-26', 126) UNION ALL
		SELECT	N'Маша', CONVERT(DATE, '2001-01-02', 126) UNION ALL
		SELECT	N'Маша', CONVERT(DATE, '2001-01-02', 126) UNION ALL
		SELECT	N'Игорь', CONVERT(DATE, '2001-01-03', 126) UNION ALL
		SELECT	N'Маша', CONVERT(DATE, '2001-01-03', 126)
	)
SELECT distinct k.customer
FROM asd k	
	JOIN asd k2 ON k.customer = k2.customer and DATEDIFF(dd,k.d,k2.d) = 1
15 ноя 16, 19:03    [19897434]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить