2011-07-26 11 views
1

アイテムの以前の履歴に基づいてどのように選択しますか?T-SQL反復的に履歴パターンを確認する

たとえば、val = 1、以前にval = 10、かつval = 1の項目を選択しようとしています。以下のデータを満たす必要があるitemIdは、 itemId = 3

WITH Items (itemId, date, val) AS (
     SELECT 1, CONVERT(datetime, '5/1/2011'), 6 UNION ALL 
     SELECT 2, CONVERT(datetime, '5/1/2011'), 5 UNION ALL 
     SELECT 3, CONVERT(datetime, '5/1/2011'), 1 UNION ALL 
     SELECT 1, CONVERT(datetime, '6/1/2011'), 1 UNION ALL 
     SELECT 2, CONVERT(datetime, '6/1/2011'), 10 UNION ALL 
     SELECT 3, CONVERT(datetime, '6/1/2011'), 10 UNION ALL 
     SELECT 1, CONVERT(datetime, '7/1/2011'), 1 UNION ALL 
     SELECT 2, CONVERT(datetime, '7/1/2011'), 1 UNION ALL 
     SELECT 3, CONVERT(datetime, '7/1/2011'), 1 
    ) 
    select distinct itemId from Items where val = 1 
    --and a previous date val = 10 
    --and a previous previous date val = 1 

答えて

0

あなたは前日要件に価値を持っているので、あなたはアイテムIDと日付によってROW_NUM注文を使用する必要があります。その後

あなたは2つの自己がIDに加入プラスROWNUMは(前の日付に有効で)その前に一つに結合し、そして1-10-1

WITH Items_Original (itemId, date, val) AS 
(
    SELECT 1, CONVERT(datetime, '5/1/2011'), 6 UNION ALL 
    SELECT 2, CONVERT(datetime, '5/1/2011'), 5 UNION ALL 
    SELECT 3, CONVERT(datetime, '5/1/2011'), 1 UNION ALL 
    SELECT 1, CONVERT(datetime, '6/1/2011'), 1 UNION ALL 
    SELECT 2, CONVERT(datetime, '6/1/2011'), 10 UNION ALL 
    SELECT 3, CONVERT(datetime, '6/1/2011'), 10 UNION ALL 
    SELECT 1, CONVERT(datetime, '7/1/2011'), 1 UNION ALL 
    SELECT 2, CONVERT(datetime, '7/1/2011'), 1 UNION ALL 
    SELECT 3, CONVERT(datetime, '7/1/2011'), 1 
), 
Items As 
(
    Select 
     ROW_NUMBER() OVER(ORDER BY ItemId, Date) AS RowNum, * 
     FROM Items_Original 
) 
select * 
from Items I1 
    Inner JOIN Items I2 
     On I1.itemId = I2.itemId 
     And I1.RowNum = I2.RowNum-1 
    Inner JOIN Items I3 
     On I2.itemId = I3.itemId 
     And I2.RowNum = I3.RowNum-1 
Where 1=1 
    And I1.val = 1 
    And I2.val = 10 
    And I3.val = 1 
0

これはあなたの後にある特定の回答を得ます。しかし、それが抽象的な意味でどれほど有用であるかはわかりません。あなたは常に正確に3つの値、1-10-1を持つアイテムを探していますか?

SELECT 
    A.itemID 
FROM 
    Items A 
    INNER JOIN Items B ON A.itemID = B.itemID AND B.val = 10 
    INNER JOIN Items C ON B.itemID = C.itemID AND C.val = 1 
WHERE 
    A.val = 1 
0
WHERE句を追加します
WITH Items (itemId, date, val) AS (
     SELECT 1, CONVERT(datetime, '5/1/2011'), 6 UNION ALL 
     SELECT 2, CONVERT(datetime, '5/1/2011'), 5 UNION ALL 
     SELECT 3, CONVERT(datetime, '5/1/2011'), 1 UNION ALL 
     SELECT 1, CONVERT(datetime, '6/1/2011'), 1 UNION ALL 
     SELECT 2, CONVERT(datetime, '6/1/2011'), 10 UNION ALL 
     SELECT 3, CONVERT(datetime, '6/1/2011'), 10 UNION ALL 
     SELECT 1, CONVERT(datetime, '7/1/2011'), 1 UNION ALL 
     SELECT 2, CONVERT(datetime, '7/1/2011'), 1 UNION ALL 
     SELECT 3, CONVERT(datetime, '7/1/2011'), 1 
    ), 
cte as 
(
    select *, row_number() over(partition by itemId order by date) [rn] 
    from Items t 
) 

select distinct a.itemId 
from cte a 
join cte b on b.rn = a.rn + 1 and b.itemId = a.itemId 
join cte c on c.rn = b.rn + 1 and c.itemId = a.itemId 
where a.val = 1 and b.val = 10 and c.val = 1 
関連する問題