SQL условно GROUP BY: как это сделать?
Вопрос
Допустим, у меня есть следующий запрос SQL:
SELECT Meeting.id AS meetingId, Bill.id AS billId
FROM Meeting
LEFT JOIN Bill ON Meeting.FK_BillId = Bill.id
Это выводит следующее:
meetingId | billId
------------------
a | NULL
b | NULL
c | 1
d | 1
e | 1
f | 2
g | 2
И я хотел бы получить следующие выходные данные, которые группируются по billId, которые не равны NULL:
meetingId | billId
------------------
a | NULL
b | NULL
c | 1
f | 2
Как мне этого добиться? Кстати, меня не волнует неоднозначное MeetingId сгруппированных результатов.
Спасибо за вашу помощь!
Решение
В SQL Server
:
SELECT meetingId, billid
FROM (
SELECT ROW_NUMBER() OVER (PARTITION BY billId ORDER BY meetingID) AS rn,
m.*
FROM mytable m
) q
WHERE rn = 1 OR billid IS NULL
<код> ANSI код>:
SELECT MIN(meetingId), billid
FROM mytable
WHERE billid IS NOT NULL
GROUP BY
billId
UNION ALL
SELECT meetingId, billId
FROM mytable
WHERE billid IS NULL
<код> MySQL код>:
SELECT meetingId, billid
FROM mytable
WHERE billid IS NOT NULL
GROUP BY
billId
UNION ALL
SELECT meetingId, billId
FROM mytable
WHERE billid IS NULL
Это немного эффективнее, чем MIN
, если вас действительно не волнует, какой meetingID
будет возвращен, если он принадлежит правильной группе. р>
Другие советы
Вы можете объединить 2 запроса, один из которых объединяет группы в ненулевые записи, а другой получает нулевые.
Не связан с StackOverflow