Я смотрю на запрос, который выводит что-то вроде следующего:
Group | Date 1 | Value 1 | Date 2 | Value 2
------+------------+---------+-------------+--------
A | 2011-06-15 | 105 | NULL | NULL
A | NULL | NULL | 2011-06-16 | 107
B | 2011-06-18 | 567 | NULL | NULL
B | NULL | NULL | 2011-06-20 | 525
То, что я хочу, это "сгладить" эти результаты по группам - вроде как COALESCE
по строке:
Group | Date 1 | Value 1 | Date 2 | Value 2
------+------------+---------+-------------+--------
A | 2011-06-15 | 105 | 2011-06-16 | 107
B | 2011-06-18 | 567 | 2011-06-20 | 525
Обратите внимание, что в каждой группе будет только 2 строки; это не относится к произвольному количеству точек данных, это, по сути, запрос «до и после».
Возможно ли это сделать за одиночный проход? (В результатах содержится большое количество данных). Это значит:
- Нет временные таблицы, табличные переменные или аналогичные промежуточные шаги (CTE в порядке);
- Нет присоединения к себе, то есть очевидное решение получения
MIN
и MAX
в одном запросе, а затем присоединение к этим датам для получения значений. Как упоминалось выше, это результирующий набор дорогого запроса, и я очень стараюсь не удваивать нагрузку.
Я знаю, что технически я мог бы сделать это с помощью курсора, но я бы действительно действительно предпочел бы не делать этого, если кто-то не докажет мне, что это быстрее, чем любая опция на основе множеств.
P.S. Обратите внимание, что для группы «B» значение 2 ниже значения 1. Я сделал это явно, чтобы продемонстрировать, почему один GROUP BY
, который принимает MIN
и MAX
как даты, так и значения, не собирается для получения ожидаемых результатов. Значения должны быть соотнесены с датами.