2017-05-02 17 views
0

私はこのようなデータを持っている:日付が最小の列の合計値を取得していますか?

DATE      ID  weight 
----      ----  ------- 
2017-04-25 11:05:42.273 247  0.418 
2017-04-25 11:05:42.310 248  0.568 
2017-04-25 13:57:55.327 247  0.418 
2017-04-25 13:57:55.360 247  0.534 
2017-04-25 13:57:55.397 248  0.568 
2017-04-25 13:57:55.453 248  0.448 

今の要件は、私は最小の日付を持つbarcodeidに基づいて総重量を合計する必要があります。

それは、それぞれ、バーコード247及び248の最小の日付を持っているので、ここでの出力は、(0.418 + 0.568)であるべきです。

答えて

3

ウィンドウ関数を使用して、各パーティション(ID)の最初から行番号を割り当てます。 次にrownumber 1を加算するだけです。RNで制限することができないため、CTEまたはサブクエリーが必要です。

パーティションは、指定された列の単なるレコードのグループです。 IDは247と248が異なるグループで行番号1が各パーティションの最も早い日付に割り当てられます。次に、rn = 1と言うとき、それぞれの異なるIDの最も早い日付の重みを取得するだけです!

WITH CTE AS (SELECT A.* 
        , Row_NUMBER() Over (Partition by ID order by Date asc) RN 
      FROM TABLE A) 
SELECT Sum(Weight) 
FROM CTE 
WHERE RN = 1 
1

編集:よく私は私の顔に卵を持っています。固定

私は、単純なサブクエリが

SELECT sum(weight) 
FROM Table t1 
WHERE DATE = (select min(DATE) from Table t2 where t1.ID = t2.ID group by id) 
+0

これはOPが探している結果が得られないだけで十分だろうと信じています。これは各IDの最小の合計です。彼らは各IDの最も早いエントリーの加重の合計を求めます。 –

+0

私はIDでグループ化する必要があると思います。さもなければ、1分の日付しか得られませんか? – xQbert

+0

私は実際にそれを素早く取り出しましたが、私の日はそうではありません。 – SCFi

0
;With cte([DATE],ID,[weight]) 
AS 
(

SELECT '2017-04-25 11:05:42.273', 247, 0.418 Union all 
SELECT '2017-04-25 11:05:42.310', 248, 0.568 Union all 
SELECT '2017-04-25 13:57:55.327', 247, 0.418 Union all 
SELECT '2017-04-25 13:57:55.360', 247, 0.534 Union all 
SELECT '2017-04-25 13:57:55.397', 248, 0.568 Union all 
SELECT '2017-04-25 13:57:55.453', 248, 0.448 
) 
SELECT Sum(MinWeight) [SumOFweight] From 
(
SELECT ID,DATE,Min([weight])OVER(Partition by DATE) AS MinWeight ,Row_NUMBER() Over (Partition by ID order by Date asc) RN From 
(
SELECT DATE,ID,SUM([weight])[weight] FROM cte 
GROUP by ID,DATE 
)dt 
)Final 
where Final.RN=1 

アウトプット

SumOFweight 
------------- 
0.986 
関連する問題