sql >> データベース >  >> RDS >> Sqlserver

連続する n 番目のグループの最初/最後の行を取得する

    サブクエリでウィンドウ関数 ROWNUMBER を使用する必要があります...

    このような方法でそこにたどり着きます:

    ROW_NUMBER() OVER(PARTITION BY Price ORDER BY Claim_Submitted_Date DESC) AS Row 
    

    あなたのフィドルに基づく更新は次のとおりです:

    DECLARE @material VARCHAR(20)
    SET @material = '1271-4303'
    
    
    SELECT * FROM
    (
    SELECT  *,
            ROW_NUMBER() OVER(PARTITION BY Material ORDER BY Claim_Submitted_Date ASC) AS rn  
    FROM tabdata t2 
    WHERE Material = @material
    ) res
    WHERE rn=2
    

    idData がインクリメンタル (したがって時系列) である場合、これを使用できます:

    SELECT * FROM
    (
    SELECT  *,
            ROW_NUMBER() OVER(PARTITION BY Material ORDER BY idData DESC) AS rn  
    FROM tabdata t2 
    WHERE Material = @material
    ) res
    

    あなたの最新の要件を見て、私たちはそれを考えすぎている可能性があります (私があなたを正しく理解していれば):

    DECLARE @MATERIAL AS VARCHAR(9)
    SET @MATERIAL = '1271-4303'
    
    SELECT  TOP 1 *
    FROM tabdata t2 
    WHERE Material = @material
    AND PRICE <> (  SELECT TOP 1 Price
                    FROM tabdata 
                    WHERE Material = @material 
                    ORDER BY CLAIM_SUBMITTED_DATE desc)
    ORDER BY CLAIM_SUBMITTED_DATE desc
    
    --results
    idData  Claim_Submitted_Date        Material    Price
    7       2013-11-08 12:16:00.000     1271-4303   18
    

    ここに フィドル があります これに基づいています。



    1. AnySQLMaestroをSalesforce.comに接続する

    2. 日付文字列をタイムゾーンなしのタイムスタンプに変換します

    3. colid 6 の bcp クライアントから無効な列の長さを受け取りました

    4. PostgreSQLからデータベースにダンプをマージする方法は?