0

これが私のテーブル構造です:-

Table01
ID  Name    FkID  dateTime
1   John    1     2012-06-01
2   Peter   2     2012-06-02
3   Penny   2     2012-06-03
4   Patty   3     2012-06-01

私はこのクエリを試しましたが:(

select * 
from Table01 
where FkID in 
(SELECT FkID FROM Table01 GROUP BY FkID HAVING ( COUNT(PkID) < 2 ))
order by dateTime desc

望ましい結果:-

1   John    1     2012-06-01
3   Penny   2     2012-06-03
4   Patty   3     2012-06-01

FkID による一意の結果が必要ですが、重複した FkID から最新の日時で行を取得する必要があります。任意のガイドラインをお願いします。

4

2 に答える 2

1

これを行うには、テーブルに2回参加します。

select t1.id, t1.name, t1.dt
from t t1
inner join
(
    select fkid, max(dt) as dt
    from t
    group by fkid
) t2
    on t1.fkid = t2.fkid
    and t1.dt = t2.dt
order by t1.id

SQL FiddlewithDemoを参照してください

于 2012-07-10T14:44:23.720 に答える
1

ROW_NUMBER を使用してそれを実現できます。

WITH A AS (
  SELECT *, ROW_NUMBER() OVER (PARTITION BY FkID ORDER BY dateTime DESC) AS rn
  FROM Table01 
)
SELECT ID, Name, FkID, dateTime
FROM A
WHERE rn = 1;

共通テーブル式 (WITHステートメント) を使用しましたが、通常のサブクエリでも同様に実行できます。しかし、実際にROW_NUMBER()は、グループ化されたデータ (つまり、PARTITION 化されたデータ) を操作したい場合に便利です。

于 2012-07-10T14:38:39.707 に答える