2017-06-12 7 views
1

私の下のクエリは正常に動作し、最新のスキャンに基づいて異なる製品に新しい製品を登録します。SQL "Partition"チェックが正常に動作しない

私の問題は、同じIDの製品を受け取ることがあります(実際には可能です)。 私のベローのテーブルには場所があり、通常はプロダクトがの位置5に届くと、それは完了したことを意味し、新しい製品が登録されると、常にの位置1から始まります。 下記のように私はもう一度製品 "2222"を取得しました。私は "FirstScanned"を検索するには2222 '、1、2017-05-17 15:58の代わりに2222'、1 「2017年3月21日午前9時50

,min(p.Scanned) over (partition by p.ProductNR) as FirstScanned 

テーブル:

CREATE TABLE Products 
(
    ProductNR varchar (14), 
    Location int, 
    Scanned Datetime 
); 
Insert Into Products(ProductNR, Location, Scanned) 
Values('1111', 1, '2017-03-15 09:30'), 
    ('1111', 2, '2017-03-16 11:35'), 
    ('1111', 3, '2017-03-21 12:37'), 
    ('2222', 1, '2017-03-21 09:50'), 
    ('2222', 5, '2017-03-21 12:58'); 
    ('2222', 1, '2017-05-17 15:58'); 

とクエリ

select p.ProductNR, p.Location, p.Scanned 
    ,case 
     when p.FirstScanned >= dateadd(day, -5, getdate()) then 'Less than 5 days old' 
     when p.FirstScanned <= dateadd(day, -5, getdate()) then 'More than 5 days old' 
     else '0' 
    end as Age 
from 
(
    select p.ProductNR 
     ,p.Location 
     ,p.Scanned 
     ,min(p.Scanned) over (partition by p.ProductNR) as FirstScanned 
     ,max(p.Scanned) over (partition by p.ProductNR) as LastScanned 
    from Products p 
) p 
where p.LastScanned = p.Scanned 
+0

プラス1のテストデータでも、期待結果と実際の結果を加算します – TheGameiswar

+0

ありがとう!私は、基本的に新しいproduktが既に同じproductnrを持っている私のテーブルに登録されていることを期待しています。私は、新しいものだけを検索し、古いものは検索しないようにしたい。古いものは、通常、私が上で説明したように位置5によって閉じられ、日付も古いものと定義されています – MishMish

+0

1111の場合、出力は何ですか?ロケーション5のレコードがないため、レコードが選択されていませんか? –

答えて

0
; WITH p1 AS (
    SELECT p.ProductNR 
     ,p.Location 
     ,p.Scanned 
    FROM #Products p 
    WHERE p.Location <> 5 
) 
, p2 AS (
    SELECT p2.ProductNR 
     ,p2.Location 
     ,p2.Scanned 
     ,min(p2.Scanned) OVER (PARTITION BY p2.ProductNR) AS FirstScanned 
     ,max(p2.Scanned) OVER (PARTITION BY p2.ProductNR) AS LastScanned 
    FROM p1 p2 
) 

SELECT p3.ProductNR 
    , p3.Location 
    , p3.Scanned 
    , CASE 
     WHEN p3.FirstScanned >= dateadd(day, -5, getdate()) THEN 'Less than 5 days old' 
     WHEN p3.FirstScanned <= dateadd(day, -5, getdate()) THEN 'More than 5 days old' 
     ELSE '0' 
    END AS Age 
FROM p2 p3 
WHERE p3.LastScanned = p3.Scanned 
+0

パーティションを作成する前に、含めたくないレコードを除外する必要があります。次に、CTEでCTEを実行して、その結果をフィルタリングします。 – Shawn

+0

私はあなたの論理を理解しています、それは今試してみてください! – MishMish

関連する問題