2

このテーブルには、IDごとに2行、IDごとに2行以下があります

id  date       amt
-------------------    
001 01/01/2012 100
001 01/12/2011 200
002 01/01/2013 100
002 01/12/2012 200
003 12/08/2012 500
003 31/12/2011 200
...

max(date)現在と前の行のamtの違いで各IDの行のを表示したい

期待される出力

id  date       amt
------------------    
001 01/01/2012 100
002 01/01/2013 100
003 12/08/2012 300
...

これを行う方法?

4

2 に答える 2

2

あなたはこれで試すことができます:

DECLARE @tbl TABLE (id VARCHAR(10), date DATE, amt INT)
INSERT @tbl VALUES
('001', CONVERT(DATE, '01/01/2012', 103), 100),
('001', CONVERT(DATE, '01/12/2011', 103), 200),
('002', CONVERT(DATE, '01/01/2013', 103), 100),
('002', CONVERT(DATE, '01/12/2012', 103), 200),
('003', CONVERT(DATE, '12/08/2012', 103), 500),
('003', CONVERT(DATE, '31/12/2011', 103), 200),
-- Added to display the one id - one row situation
('004', CONVERT(DATE, '14/02/2011', 103), 999),
('000', CONVERT(DATE, '02/02/2012', 103), 100),
('100', CONVERT(DATE, '09/09/2011', 103), 999)

;WITH a AS
(
    SELECT  id
            , amt
            , date      
            , ROW_NUMBER() OVER (PARTITION BY id ORDER BY date ASC) num
            , COUNT(*) OVER (PARTITION BY id) cnt
    FROM    @tbl
)

SELECT  t1.id
        , t1.date
        , ABS(t1.amt - t2.amt)
FROM    a t1
JOIN    a t2 ON (t1.id = t2.id AND t1.num = t2.num + 1)
OR      (t1.id = t2.id AND t2.cnt = 1)

ID 1と2の1行目と2行目の差は-100なので、ABS絶対値を返す関数を追加しました。

また、IDごとにレコードが1つしかない場合に状況がどのように処理されるかを示すために、サンプルデータを追加しました。

于 2013-02-25T07:28:52.403 に答える
1

これを試して:

WITH CTE
AS
(
   SELECT *,
     ROW_NUMBER() OVER(PARTITION BY Id ORDER BY Date DESC) AS Rownum
   FROM Table1
), CTE2
AS
(
  SELECT 
    id, 
    date, 
    amt, ROW_NUMBER() OVER(ORDER BY Id) AS rank
  FROM CTE c1
  WHERE rownum = 1
)
SELECT 
  id, 
  date, 
  amt - ISNULL((SELECT c2.amt
                FROM CTE2 c2
                WHERE c1.rank - c2.rank = 1), 0)
FROM CTE2 c1;

SQLフィドルデモ

于 2013-02-25T07:01:18.007 に答える