2017-12-21 17 views
1

:私が欲しいクエリは、Nフィールドに基づいて最大の行を検索するには、次のデータが与えられ

ID Name, Value, TimeStamp 
1, 'A', 7.00, 21/12/2017 
2, 'A', 5.00, 21/12/2017 
3, 'A', 6.00, 20/12/2017 
4, 'B', 1.00, 21/12/2017 

結果は次のとおりです。

Name, Value, TimeStamp 
'A', 5.00, 21/12/2017 
'B', 1.00, 21/12/2017 

すなわち、名前によるグループ及び2以上が同じタイムスタンプが最新のID

と1を取る持っている場合は、最新のタイムスタンプとの値を取る、私は別のポストに類似していた答えを見つけるように見えるんでした:

SELECT ID, Name, Value, TimeStamp 
FROM MyTable 
JOIN (SELECT Name, MAX(TimeStamp) As TimeStamp 
     FROM MyTable 
     GROUP BY Name) m 
    ON MyTable.Name = m.Name and MyTable.TimeStamp = a.TimeStamp 

この

WITH CTE AS (
    ... 
) 
SELECT Name, Value, TimeStamp 
FROM CTE 
JOIN (SELECT Name, MAX(ID) 
     FROM CTE 
     GROUP BY Name) a 
    ON CTE.Name = a.Name AND CTE.ID = a.ID 

をしかし、私は今、3つのフィールドにそれをスケールアップする場合に何が起こるか:IDを取得するので、私の最大のタイムスタンプを与え、私はつまり、私が使用することができ、プロセスを繰り返すことができます。これを行う簡単な方法はありますか、私は再帰的なCTEを実験していませんでした。動的SQLを回避しようとしています。

+0

1、 'A'、7.00,21/12/2017が 'A'になり、 '2017-12-21 | 1'と7.00が3つのフィールドとして統合された列でMAXを実行するので、解決策を見つけた可能性があります – Glen

+0

あなたの電話で申し訳ありませんので、まだ答えを入力することはできません – twoleggedhorse

+0

そしてあなたは名前で分割する必要があります – twoleggedhorse

答えて

1

私はこのためにROW_NUMBER関数を使いたいと思うかもしれません。以下は例です。

;WITH 
test_data 
AS 
(
    SELECT tbl.* FROM (VALUES 
     (1, 'A', 7.00, '21-Dec-2017') 
    , (2, 'A', 5.00, '21-Dec-2017') 
    , (3, 'A', 6.00, '20-Dec-2017') 
    , (4, 'B', 1.00, '21-Dec-2017') 
    ) tbl ([ID], [Name], [Value], [TimeStamp]) 
) 
, 
test_data_order 
AS 
(
    SELECT 
      [ID] 
     , [Name] 
     , [Value] 
     , [TimeStamp] 
     , EX_ROW_NUMBER = ROW_NUMBER() OVER 
      (
       PARTITION BY 
         [Name] 
       ORDER BY 
         [TimeStamp] DESC 
        , [ID] DESC 
      ) 
    FROM 
     test_data 
) 
SELECT 
    * 
FROM 
    test_data_order 
WHERE 
    EX_ROW_NUMBER = 1 

結果:

私はちょうどあなたがしようとすると、優先度などのために、1つの連結フィールドとして問題になっているすべてのフィールドを結合することができ、別のポストを見た

enter image description here

関連する問題