0

特定の 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  
4

2 に答える 2

0

もしかして、こういうこと?

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
  );
于 2013-11-10T08:49:15.513 に答える
0

ネクタイを返却するかどうかによって異なります。

ネクタイを返したい場合は、以下のアプローチを使用できます。

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グレード
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グレード
1 4
1 5
2 5
2 4
3 3
3 4
4 3

SQLフィドル:SQLFiddle

于 2013-11-10T08:51:36.783 に答える