-1

今朝問題が発生しました。多くの解決策を試しましたが、期待どおりの結果が得られませんでした。

次のようなテーブルがあります。

+----+----------+-------+
| ID | COL2     | DATE  | 
+----+----------+-------+
|  1 | 1        |  2001 | 
|  1 | 2        |  2002 | 
|  1 | 3        |  2003 | 
|  1 | 4        |  2004 | 
|  2 | 1        |  2001 | 
|  2 | 2        |  2002 | 
|  2 | 3        |  2003 | 
|  2 | 4        |  2004 | 
+----+----------+-------+

そして、次のような結果を返すクエリがあります: 一意の ID があり、この ID に対して ID の最後の日付を取得したい

+----+----------+-------+
| ID | COL2     | DATE  | 
+----+----------+-------+
|  1 | 4        |  2004 | 
|  2 | 4        |  2004 | 
+----+----------+-------+

しかし、どうすればそれができるかわかりません。Join 、 CROSS APPLY を試しました ..

アイデアがあれば、

ありがとうございました

クレメント・ファヤード

4

5 に答える 5

1
declare @t table (ID INT,Col2 INT,Date INT)
insert into @t(ID,Col2,Date)values (1,1,2001)
insert into @t(ID,Col2,Date)values (1,2,2001)
insert into @t(ID,Col2,Date)values (1,3,2001)
insert into @t(ID,Col2,Date)values (1,4,2001)
insert into @t(ID,Col2,Date)values (2,1,2002)
insert into @t(ID,Col2,Date)values (2,2,2002)
insert into @t(ID,Col2,Date)values (2,3,2002)
insert into @t(ID,Col2,Date)values (2,4,2002)

;with cte as(
    select
        *,
        rn = row_number() over(partition by ID order by Col2 desc)
    from @t

)
select
    ID,
    Col2,
    Date
from cte
where
    rn = 1
于 2014-11-20T09:44:25.650 に答える
0

テーブルの名前を教えてくれなかったので、以下であると仮定しますtbl

SELECT m.ID, m.COL2, m.DATE
FROM tbl m
  LEFT JOIN tbl o ON m.ID = o.ID AND m.DATE < o.DATE
WHERE o.DATE is NULL
ORDER BY m.ID ASC

説明: クエリ left は、列;を使用して、 ("max" の場合)tblとしてエイリアス化されたテーブルをそれ自体 ( "others" の場合はエイリアス) に対して結合します。条件は、 のすべての行を のより大きな値を持つからの行と結合します。fromの特定の値に対しての最大値を持つ行にはペアがありません (最大値より大きい値はありません)。この行のため、 s の行と結合されます。この節は、 forを持つ行(つまり、最大値 を持つ行) のみを選択します。moIDm.DATE < o.DATEmoDATEDATEIDmoLEFT JOINNULLWHERENULLo.DATEm.DATE

その他の SQL に関するヒントについては、「 SQL アンチパターン: データベース プログラミングの落とし穴を回避する」ブックを確認してください。

于 2014-11-20T10:12:47.860 に答える
0

col2 と date の組み合わせが常に最大値である場合は、試すことができます

SELECT ID, MAX(COL2), MAX(DATE)
FROM Table1
GROUP BY ID

しかし、それは本当に良いことではありません。代替手段は、次のサブクエリです。

SELECT yourtable.ID, sub1.COL2, sub1.DATE
FROM yourtable 
INNER JOIN -- try with CROSS APPLY for performance AND without ON 1=1
(SELECT TOP 1 COL2, DATE
 FROM yourtable sub2
 WHERE sub2.ID = topquery.ID
 ORDER BY COL2, DATE) sub1 ON 1=1
于 2014-11-20T09:59:53.470 に答える
0

これを行うには、除外するCOL2必要があります。クエリは次のようになります

SELECT ID, MAX(DATE) 
FROM table_name 
GROUP BY ID 

上記のクエリは、各 ID の最大日付を生成します。各IDとCOL2の最大日付が必要でない限り、そのクエリでCOL2を使用しても意味がありません。その場合、次を実行できます。

SELECT ID, COL2, MAX(DATE) GROUP BY ID, COL2;

集計関数 (max() など) を使用する場合は、select ステートメントにある他のすべての列で常にグループ化する必要があります。

テーブルの設計に根本的な欠陥があるため、この問題に直面していると思います。通常、ID は主キー (一意) にする必要があります。この表では、ID が繰り返されています。私はテーブルの背後にあるビジネス ロジックを理解していませんが、私にはいくつかの欠陥があるようです。

于 2014-11-20T10:44:39.153 に答える