SQLSERVER 2017: выберите первое вхождение смежных групп, упорядоченных по дате - PullRequest
0 голосов
/ 10 октября 2019

Это сложно сформулировать. Я нахожусь на SQLSERVER 2017. Что я хочу сделать, это выбрать первое вхождение строк в наборе на основе того, как они сгруппированы. Тем не менее, эти «группы» повторяются иногда. Группировка - спонсор_дист_ид, но проблема для меня в том, что я не могу просто получить первое вхождение каждого спонсора_дист_ид по дате, потому что эта группа повторяется для другого набора дат позже. Мне нужно первое появление этого тоже - и так далее. Пример:

+---------+-----------------+------------------+------------------+
| dist_id | sponsor_dist_id |   it_beg_date    |   it_end_date    |
+---------+-----------------+------------------+------------------+
|   76566 |           48584 | 10/13/2015 00:00 | 10/30/2015 00:00 |
|*  76566 |           48584 | 10/30/2015 00:00 | 11/28/2016 00:00 |
|*  76566 |           48584 | 11/28/2016 00:00 | 11/28/2016 00:00 |
|   76566 |               4 | 11/28/2016 00:00 | 11/28/2016 00:00 |
|   76566 |           48584 | 11/28/2016 00:00 | 11/29/2016 00:00 |
|*  76566 |           48584 | 11/29/2016 00:00 | 11/28/2018 00:00 |
|*  76566 |           48584 | 11/28/2018 00:00 | 11/29/2018 00:00 |
|*  76566 |           48584 | 11/29/2018 00:00 | 11/30/2018 00:00 |
|   76566 |               4 | 11/30/2018 00:00 | NULL             |
+---------+-----------------+------------------+------------------+

* Для генерации источника

SELECT convert(numeric(20,0),dist_id) dist_id, convert(numeric(20,0),sponsor_dist_id) sponsor_dist_id, convert(datetime,it_beg_date) it_beg_date, convert(datetime, it_end_date) it_end_date 
INTO #tmp_GridResults_1
FROM (
SELECT N'76566' AS [dist_id], N'48584' AS [sponsor_dist_id], N'2015-10-13 00:00:00.000' AS [it_beg_date], N'2015-10-30 00:00:00.000' AS [it_end_date] UNION ALL
SELECT N'76566' AS [dist_id], N'48584' AS [sponsor_dist_id], N'2015-10-30 00:00:00.000' AS [it_beg_date], N'2016-11-28 00:00:00.000' AS [it_end_date] UNION ALL
SELECT N'76566' AS [dist_id], N'48584' AS [sponsor_dist_id], N'2016-11-28 00:00:00.000' AS [it_beg_date], N'2016-11-28 00:00:00.000' AS [it_end_date] UNION ALL
SELECT N'76566' AS [dist_id], N'4' AS [sponsor_dist_id], N'2016-11-28 00:00:00.000' AS [it_beg_date], N'2016-11-28 00:00:00.000' AS [it_end_date] UNION ALL
SELECT N'76566' AS [dist_id], N'48584' AS [sponsor_dist_id], N'2016-11-28 00:00:00.000' AS [it_beg_date], N'2016-11-29 00:00:00.000' AS [it_end_date] UNION ALL
SELECT N'76566' AS [dist_id], N'48584' AS [sponsor_dist_id], N'2016-11-29 00:00:00.000' AS [it_beg_date], N'2018-11-28 00:00:00.000' AS [it_end_date] UNION ALL
SELECT N'76566' AS [dist_id], N'48584' AS [sponsor_dist_id], N'2018-11-28 00:00:00.000' AS [it_beg_date], N'2018-11-29 00:00:00.000' AS [it_end_date] UNION ALL
SELECT N'76566' AS [dist_id], N'48584' AS [sponsor_dist_id], N'2018-11-29 00:00:00.000' AS [it_beg_date], N'2018-11-30 00:00:00.000' AS [it_end_date] UNION ALL
SELECT N'76566' AS [dist_id], N'4' AS [sponsor_dist_id], N'2018-11-30 00:00:00.000' AS [it_beg_date], NULL AS [it_end_date] ) t;
SELECT [dist_id], [sponsor_dist_id], [it_beg_date], [it_end_date]
FROM #tmp_GridResults_1

DROP TABLE #tmp_GridResults_1
GO

И чего я хочу добиться, это:

+---------+-----------------+------------------+------------------+
| dist_id | sponsor_dist_id |   it_beg_date    |   it_end_date    |
+---------+-----------------+------------------+------------------+
|   76566 |           48584 | 10/13/2015 00:00 | 10/30/2015 00:00 |
|   76566 |               4 | 11/28/2016 00:00 | 11/28/2016 00:00 |
|   76566 |           48584 | 11/28/2016 00:00 | 11/29/2016 00:00 |
|   76566 |               4 | 11/28/2018 00:00 | NULL             |
+---------+-----------------+------------------+------------------+

Так в основном удалите строки, которые отмечены звездочкой. Однако теперь у меня есть строки, в которых даты начала и окончания имеют пробелы. Поэтому мне нужно, чтобы даты были смежными (то есть, дата начала следующей строки должна быть датой окончания первой строки). Надеюсь, что все имеет смысл. Спасибо!

Пример:

  +---------+-----------------+------------------+------------------+
    | dist_id | sponsor_dist_id |   it_beg_date    |   it_end_date    |
    +---------+-----------------+------------------+------------------+
    |   76566 |           48584 | 10/13/2015 00:00 | 11/28/2016 00:00 |
    |   76566 |               4 | 11/28/2016 00:00 | 11/28/2016 00:00 |
    |   76566 |           48584 | 11/28/2016 00:00 | 11/28/2018 00:00 |
    |   76566 |               4 | 11/28/2018 00:00 | NULL             |
    +---------+-----------------+------------------+------------------+

1 Ответ

0 голосов
/ 10 октября 2019
select dist_id, sponsor_dist_id, min(it_beg_date), max(it_end_date)
from....
where …
group by dist_id, sponsor_dist_id
order by dist_id, sponsor_dist_id

Это должно приблизить вас к этому.

РЕДАКТИРОВАТЬ: Изменено min (it_end_date) на max (it_end_date). Думаю, учитывая предоставленные вами данные, вы получите ожидаемые результаты.

...