1

(MS Sql Serverを使用して)SQLクエリを理解できません。1つのIDを持つアイテムが複数の行を持つことができるデータセットから単一の行を取得しようとしています。私を失望させているのは、正しい行が「階層」に基づいている必要があるということです。問題にcaseステートメントを投げようとしています。

いくつかのサンプルデータ:

Id           Class       Date
100          Red         2012-12-12
100          Blue        2012-12-31
200          Red         2012-10-31
300          Green       2012-04-04
300          Blue        2011-09-01

Classの値に基づいて単一の行を返したい。

Case When Red Then
    Date 
Case When Blue Then 
    Date
Case When Green Then 
    Date 
Else
    ''

最終的なデータセットは次のようになります。

Id           Class       Date
100          Red         2012-12-12
200          Red         2012-10-31
300          Blue        2011-09-01

したがって、重複する行の1つにRedの値がある場合は、最初にその行の日付を使用します。次に青、次に緑。

サブクエリ、グループバイ、持ち物、ケースステートメント、派生テーブルで遊んで、一日中これに取り組んできました。しばらく経っているので、私は自分のsqlスキルにかなり錆びています。

私がとるべき方向についてのヒントはありますか?

4

3 に答える 3

5

あなたはこれを試すことができます

;WITH cte AS
  (
    SELECT Id, Class, Date,
      row_number() OVER (PARTITION BY Id
                         ORDER BY CASE Class
                                  WHEN 'Red' THEN 1
                                  WHEN 'Blue' THEN 2
                                  WHEN 'Green' THEN 3
                                  ELSE 4 END) as rn
    FROM MyTable
   )

SELECT Id, Class, Date
FROM cte
WHERE rn = 1
于 2013-02-05T21:02:34.640 に答える
0

@bobsクエリが好きで、TSQLデータベースでうまく機能します。

これは同じことを行う別の方法であり、共通のテーブル式を持っているが同じ行番号の構文を持たない他のSQLデータベースに少し移植性があるかもしれません。

;WITH cte AS
(SELECT *, CASE Class WHEN 'Red' THEN 1 WHEN 'Blue' THEN 2
                      WHEN 'Green' THEN 3 ELSE 4 END c FROM myTable)

SELECT b1.Id, b1.Class, b1.Date
FROM cte b1 
LEFT JOIN cte b2 
  ON b1.Id = b2.Id AND b1.c > b2.c
WHERE b2.Class IS NULL

でテストするSQLfiddle

于 2013-02-05T21:20:05.907 に答える
0

試す:

select id, class, date
  from TABLE
 where class = COLOR
   and date  = (select min(date) from TABLE where class = COLOR)
于 2013-02-05T21:00:15.020 に答える