Есть ли простой способ получить идентификатор, связанный с агрегатом, как min и max? - PullRequest
0 голосов
/ 05 февраля 2019

Я всегда грубо пробираюсь через решение проблемы получения идентификатора, связанного с агрегированной операцией, такой как min и max, через некоторый некрасивый SQL-код.Мне просто интересно, если есть правильный / чистый способ решить эту проблему.Предположим, у вас есть следующее:

SELECT 1 AS groupid, 1 AS id, 100 AS val
INTO #a
UNION
SELECT 1, 2, 50
UNION
SELECT 1, 3, 75
UNION
SELECT 2, 2, 120
UNION
SELECT 2, 4, 22
UNION
SELECT 2, 1, 45

ПРИМЕЧАНИЕ # 1: id уникально в groupid

NOTE # 2: val может иметь одинаковые значенияпоэтому в этом случае столбец id будет первым идентификатором, соответствующим val

Предположим, я хочу, чтобы результат выглядел следующим образом:

groupid | min_id | min_val | max_id | max_val
   1        2         50       1        100
   2        3         22       2        120

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Используйте GROUP BY и простые функции агрегирования, подобные этой

SELECT groupid, MIN(id) AS min_id, MIN(val) as min_val, MAX(id) AS max_id, MAX(val) as max_val 
FROM table
GROUP BY groupid
0 голосов
/ 05 февраля 2019

Вы можете использовать условное агрегирование или оконные функции.Например, вы можете использовать first_value():

select distinct group_id,
       min(val) over (partition by groupid) as min_val,
       first_value(id) over (partition by groupid order by val asc) as min_id, 
       max(val) over (partition by groupid) as max_val,
       first_value(id) over (partition by groupid order by val desc) as max_id
from t;

Увы, SQL Server не поддерживает first_value() в качестве функции агрегирования, поэтому здесь используется ярлык select distinct.

...