2014-07-06 3 views
0

У меня есть таблица Образцы, которые содержат образцы цен продукта. Указание по возрастанию даты.Число последовательных строк в группе

+----+------------+-------+-------+-------------+ 
| Id | Product_Id | Price | Status| Date  | 
+----+------------+-------+-------+-------------+ 
| 1 |   1 | 400 |  0 | 1404656325 | 
| 2 |   2 | 300 |  0 | 1404657325 | 
| 3 |   3 | 100 |  0 | 1404658325 | 
| 4 |   1 | 400 |  0 | 1404659325 | 
| 5 |   2 | 300 |  0 | 1404660325 | 
| 6 |   3 | 100 |  1 | 1404661325 | 
| 7 |   1 | 500 |  1 | 1404662325 | 
| 8 |   2 | 500 |  0 | 1404663325 | 
| 9 |   3 | 500 |  1 | 1404664325 | 
+----+------------+-------+-------+-------------+ 

Я заинтересован в группировке PRODUCT_ID такой, что у меня есть список уникальных идентификаторов продуктов вместе с последней ценой (это самая большая дата).

Это несколько классическая проблема, отличная от n-на-группу, но, кроме того, я также хочу, чтобы столбец чисел отображал, сколько строк подряд Состояние столбец был таким же, начиная с самой старой даты.

Так, учитывая мой пример таблицы выше, я должен в конечном итоге,

+------------+-------+-----------------+ 
| Product_Id | Price | SameStatus  | 
+------------+-------+-----------------+ 
|   1 | 500 |    1 | 
|   2 | 500 |    3 | 
|   3 | 500 |    2 | 
+------------+-------+-----------------+ 

Я надеюсь, что это ясно, что я хочу достичь и есть дружелюбный человек хочет вести меня.

ответ

1

Это должно сработать. подход использует ROW_NUMBER()

;WITH Samples (Id, Product_Id, Price, [Status], [Date]) AS 
(
    SELECT 1, 1, 400, 0, 1404656325 UNION ALL 
    SELECT 2, 2, 300, 0, 1404657325 UNION ALL 
    SELECT 3, 3, 100, 0, 1404658325 UNION ALL 
    SELECT 4, 1, 400, 0, 1404659325 UNION ALL 
    SELECT 5, 2, 300, 0, 1404660325 UNION ALL 
    SELECT 6, 3, 100, 1, 1404661325 UNION ALL 
    SELECT 7, 1, 500, 1, 1404662325 UNION ALL 
    SELECT 8, 2, 500, 0, 1404663325 UNION ALL 
    SELECT 9, 3, 500, 1, 1404664325 
) 
,NumberingLogic AS 
(
    SELECT * 
      ,SameStatus = ROW_NUMBER() OVER (PARTITION BY Product_Id, [Status] ORDER BY [Date]) 
      ,MaxPrice = ROW_NUMBER() OVER (PARTITION BY Product_Id ORDER BY [Date] DESC) 
    FROM Samples 
) 
SELECT Product_Id 
     ,Price 
     ,SameStatus 
FROM NumberingLogic 
WHERE MaxPrice = 1 

PS. Как ваши даты работы немного неясны для меня, но я использовал их для заказа от

+0

Большое спасибо. Даты - это только временные метки unix для простоты, а не как я храню их в db в реальности. – Peter

Смежные вопросы