簡體   English   中英

如何為每個GROUP BY條件返回多個行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM