2

次のデータを含むテーブルがあるとします。

  • テーブル名 [データ]。
  • PrimaryID: テーブルのプライマリ ID。
  • ParentID: テーブルはそれ自体を参照します。これは PrimaryID に対する FK 制約です。
  • DateTime: これが最後に更新された時刻。

    PrimaryID        ParentID          Date
        1            null      1/1/2013
        2               1      1/2/2013
        3               1      1/3/2013
        4            null      1/4/2013
        5               4      1/5/2013
        6            null      1/6/2013
    

次のような結果を選択したい:

PrimaryID        ParentID
        3               1
        5               4
        6               6

各「グループ」(同じ ParentID とその親を持つすべてのエントリとして定義) について、最新の行を選択し、null の ParentID (通常、この行が親であることを示します) を置き換えたいと考えています。行自身の PrimaryID。

このようなクエリの生成をどこから始めればよいか、本当に迷っています。

次のような内部選択があります。

(SELECT PrimaryID, ISNULL(ParentID, PrimaryID) as ParentID, Date FROM [Data])

これは開始するのに正しい方向のように見えますが、ここからどこへ行くべきかわかりません。

4

2 に答える 2

3

使用できますrow_number()

select primaryid,
  coalesce(ParentID, PrimaryID) parentid
from
(
  select *,
    row_number() over(partition by coalesce(ParentID, PrimaryID)
                      order by date desc) rn
  from yourtable
) src
where rn = 1

デモで SQL Fiddle を参照してください

于 2013-01-28T17:42:54.327 に答える
2

@ypercube の助けを借りて、次のようなものが動作するはずです。

SELECT t.PrimaryId, coalesce(t.ParentId,t.PrimaryId) as parent
FROM YourTable t 
JOIN (
   SELECT coalesce(ParentId, PrimaryId) as parent, Max(DateField) as dtMax
   FROM YourTable
   GROUP BY coalesce(ParentId, PrimaryId)
) t2 ON coalesce(t.ParentId,t.PrimaryId) = parent AND t.DateField = t2.dtMax

そして、これが更新されたFiddleです。

于 2013-01-28T17:41:25.677 に答える