[英]how to return more than one row per GROUP BY condition
我正在嘗試獲取給定GROUP BY條件的TOP X結果。 我目前正在使用這樣的東西:
SELECT * FROM
(SELECT id
FROM myTable
WHERE id IN (x1, x2, ..., xn) GROUP BY id ORDER BY grade DESC
) t1
INNER JOIN myTable t2 ON t2.id=t1.id
id是一個非唯一的INT索引字段,每個值具有多個行。
這會為我返回每個ID(成績最好的行)。 如何將其轉換為每個ID返回TOP X結果?
例如,對於以下數據
id grade
2 10
2 13
2 15
3 20
4 16
4 55
4 45
4 35
4 25
5 1
假設TOP X中的X為2,我想得到以下各行:
id grade
2 15
2 13
3 20
4 50
4 40
5 1
也許是這樣的?
SELECT m.*
FROM (
SELECT id
FROM myTable
WHERE id IN (1, 3)
GROUP BY id
) AS ids
RIGHT JOIN myTable AS m ON ids.id = m.id
WHERE
m.id = ids.id AND
m.grade IN (
SELECT TOP 5 t.grade
FROM myTable AS t
WHERE t.id = ids.id
ORDER BY t.grade DESC
);
UPD:或者,甚至
SELECT m.*
FROM myTable AS m
WHERE
m.id IN (1, 2) AND
m.grade IN (
SELECT TOP 5 t.grade
FROM myTable AS t
WHERE t.id = m.id
ORDER BY t.grade DESC
);
這取決於您是否要返回領帶。
如果您希望返回領帶,則可以使用以下方法:
CREATE TABLE grades (
id INT,
grade INT
);
INSERT INTO grades VALUES (1, 2);
INSERT INTO grades VALUES (1, 3);
INSERT INTO grades VALUES (1, 4);
INSERT INTO grades VALUES (1, 5);
INSERT INTO grades VALUES (2, 5);
INSERT INTO grades VALUES (2, 5);
INSERT INTO grades VALUES (2, 5);
INSERT INTO grades VALUES (2, 4);
INSERT INTO grades VALUES (3, 3);
INSERT INTO grades VALUES (3, 4);
INSERT INTO grades VALUES (4, 3);
SELECT id, grade
FROM grades g
WHERE (
SELECT COUNT(DISTINCT grade) FROM grades
WHERE id = g.id
AND grade >= g.grade
) <= 2;
輸出:
ID GRADE 1 4 1 5 2 5 2 5 2 5 2 4 3 3 3 4 4 3
如果您不想要這種聯系,請使用DISTINCT:
SELECT DISTINCT id, grade
FROM grades g
WHERE (
SELECT COUNT(DISTINCT grade) FROM grades
WHERE id = g.id
AND grade >= g.grade
) <= 2;
輸出:
ID GRADE 1 4 1 5 2 5 2 4 3 3 3 4 4 3
SQLFiddle: SQLFiddle
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.