分组中的第1行和第7行

时间:2014-07-07 14:25:32

标签: tsql

我将此表命名为 Samples 。 Date列值只是符号日期值。

+----+------------+-------+------+
| Id | Product_Id | Price | Date |
+----+------------+-------+------+
|  1 |          1 |   100 |    1 |
|  2 |          2 |   100 |    2 |
|  3 |          3 |   100 |    3 |
|  4 |          1 |   100 |    4 |
|  5 |          2 |   100 |    5 |
|  6 |          3 |   100 |    6 |
...
+----+------------+-------+------+

我想按product_id进行分组,以便我按降序日期顺序排列第1个样本,并使用每个产品组中第7个样本行的价格添加新colomn。如果第7行不存在,则该值应为null。

示例:

+----+------------+-------+------+----------+
| Id | Product_Id | Price | Date | 7thPrice |
+----+------------+-------+------+----------+
|  4 |          1 |   100 |    4 | 120      |
|  5 |          2 |   100 |    5 | 100      |
|  6 |          3 |   100 |    6 | NULL     |
+----+------------+-------+------+----------+

我相信我可以通过以下

获得没有'7thPrice'的桌子
SELECT * FROM (
    SELECT ROW_NUMBER() OVER (PARTITION BY Product_Id ORDER BY date DESC) r, * FROM Samples
) T WHERE T.r = 1

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

你可以尝试这样的事情。我用你的查询来创建一个CTE。然后将rank1加入rank7。

 ;with sampleCTE 
   as 
  (SELECT ROW_NUMBER() OVER (PARTITION BY Product_Id ORDER BY date DESC) r, * FROM Samples)

select * 
from
  (select * from samplecte where r = 1) a
left join
  (select * from samplecte where r=7) b
on a.product_id = b.product_id