4

、、、のようなT列を持つテーブルがありますxyab

SELECT x,y,a,b FROM T
ORDER BY x,y,a,b

次の表を教えてください

 x    | y    | a    | b
 x1   | y1   | a1   | b1
 x1   | y1   | a1   | b2
 x1   | y1   | a2   | b1
 x1   | y2   | a1   | b1
 x1   | y2   | a1   | b2
 x1   | y2   | a2   | b1

各x、yグループの最初の行を取得するにはどうすればよいですか? つまり、次の表を取得するにはどうすればよいですか

 x    | y    | a    | b
 x1   | y1   | a1   | b1
 x1   | y2   | a1   | b1

2 番目の例を次に示します。

 x    | y    | a    | b
 x1   | y1   | a1   | b3
 x1   | y1   | a1   | b4
 x1   | y1   | a2   | b1
 x1   | y1   | a2   | b2
 x1   | y2   | a1   | b3
 x1   | y2   | a1   | b4
 x1   | y2   | a2   | b1
 x1   | y2   | a2   | b2

私は得ることを期待しています

 x    | y    | a    | b
 x1   | y1   | a1   | b3
 x1   | y2   | a1   | b3
4

4 に答える 4

9

SQL 2005 以降の場合:

SELECT T1.X,
       T1.Y,
       T1.A,
       T1.B
  FROM
      (SELECT X,
              Y,
              A,
              B,
              ROW_NUMBER() OVER (Partition BY X,Y Order By A,B) AS RowNum
         FROM T
     ) T1
WHERE T1.RowNum = 1
于 2012-07-11T02:03:37.130 に答える
3

コメントと新しいテーブル構造に従って、この単純な DBMS に依存しないソリューションを使用できます。

SELECT a.x,a.y,a.a,MIN(a.b) b
FROM T a
JOIN ( SELECT x,y,MIN(a) a FROM T GROUP BY x,y ) b ON
    a.x = b.x AND
    a.y = b.y AND
    a.a = b.a
GROUP BY a.x,a.y,a.a

SQL フィドルのデモ

于 2012-07-11T02:26:14.290 に答える
0

これが非常に効率的なOracleソリューションです

select x, 
       y, 
       min(a) as a, 
       min(b) keep( dense_rank first order by a) as b
  from T
 group by x,y
于 2012-07-11T04:13:38.243 に答える
0

これを試して、私に知らせてください

select x,y,MIN(a) a,MIN(b) b
from T
group by X,y
于 2012-07-11T07:07:41.323 に答える