1

これを機能させるにはいくつかの問題があります。このデータを含むテーブルがあります。

|     DateStarted       |     Field9     |     Field2     |      ID      |    Field6   |
----------------------------------------------------------------------------------------
|  2013-04-15 09:23:00  |      TEST1     |      TEST2     |      1       |     2000    |
|  2013-04-08 09:23:00  |      TEST1     |      TEST2     |      2       |      180    |
|  2013-04-15 09:23:00  |      TEST2     |      TEST3     |      3       |     1000    |
|  2013-04-04 09:23:00  |      TEST2     |      TEST3     |      7       |       80    |
|  2013-04-03 09:23:00  |      TEST2     |      TEST4     |      5       |       70    |

私の最終的な目標は、Field9 の値の最後の 2 つの日付を返して、Field9 の一意のインスタンスごとに Field6 の値を減算できるようにすることでした。以下はリターンの一例です。

|     DateStarted       |     Field1     |     Field2     |      ID      |    SUB      |
----------------------------------------------------------------------------------------
|  2013-04-15 09:23:00  |      TEST1     |      TEST2     |      1       |     1820    |
|  2013-04-15 09:23:00  |      TEST2     |      TEST3     |      3       |      920    |

したがって、2 行目では、最も大きい 2 つの日付を取り、次に field6 の値を取り、それらを差し引いて 1 行だけを返します。

4

2 に答える 2

2

Field1パーティション化されたウィンドウ関数を使用して、 の一意の値ごとに最新の行を取得できます。

;WITH x AS
(
  SELECT DateStarted, Field9, Field2, ID, Field6,
   rn = ROW_NUMBER() OVER (PARTITION BY Field9 ORDER BY DateStarted DESC)
  FROM dbo.your_table_name
),
y AS 
(
  SELECT x.*, [SUB] = x.Field6 - COALESCE(y.Field6, 0)
  FROM x LEFT OUTER JOIN x AS y
  ON x.Field9 = y.Field9
  AND x.rn = 1 AND y.rn = 2
)
SELECT DateStarted, Field1 = Field9, Field2, ID, [SUB]
  FROM y
  WHERE rn = 1
  ORDER BY Field1;

SQL フィドルのデモ

于 2013-04-15T15:58:30.163 に答える
0

違いを取得する 1 つの方法は、2 つの行を識別し、それらを一緒に集計することです。

select MAX(case when seqnum = 1 then DateStarted end), Field1,
       max(case when seqnum = 1 then Field2 end) as Field2
       MAX(case when seqnum = 1 then id end) as Id,
       MAX(case when seqnum = 1 then field3 end) - MAX(case when seqnum = 2 then field 3 end) as sub
from (SELECT DateStarted, Field1, Field2, ID, Field3,
             ROW_NUMBER() OVER (PARTITION BY Field1 ORDER BY DateStarted DESC) as seqnum
      FROM t
     ) t
group by Field1

これは、条件付き集計を使用して差を取得します。

于 2013-04-15T16:06:04.383 に答える