【发布时间】:2018-05-03 12:38:07
【问题描述】:
我有一个 SQL Server 2008 R2 表的子集,如下所示:
cust_id | prod_id | day | price
--------+---------+-----+-------
137656 194528 42373 9.11
137656 194528 42374 9.11
137656 194528 42375 9.61
137656 194528 42376 9.61
137656 194528 42377 9.11
137656 194528 42378 9.11
我需要像这样对不同的价格周期进行排名:
cust_id | prod_id | day | price | rank
--------+---------+-----+-------+------
137656 194528 42373 9.11 1
137656 194528 42374 9.11 1
137656 194528 42375 9.61 2
137656 194528 42376 9.61 2
137656 194528 42377 9.11 3
137656 194528 42378 9.11 3
以便它按cust_id、prod_id 和day 升序排序,但在价格变化时增加排名。我曾尝试像这样使用DENSE_RANK():
SELECT
cust_id, prod_id, [day], price,
DENSE_RANK() OVER (ORDER BY cust_id, prod_id, price)
FROM
@prices
这会返回类似:
cust_id | prod_id | day | price | rank
--------+---------+-----+-------+------
137656 194528 42373 9.11 1
137656 194528 42374 9.11 1
137656 194528 42377 9.11 1
137656 194528 42378 9.11 1
137656 194528 42375 9.61 2
137656 194528 42376 9.61 2
显然,从排序中排除这一天会给我这些结果,但每当我在DENSE_RANK() 的按部分的顺序中包含这一天时 - 它只是将每个新的一天划分为一个新的 ID....
有人对这应该如何工作有任何想法吗?感谢任何建议,如果需要,可以提供更多信息
【问题讨论】:
-
作为说明,我尝试使用difference in row number method,但失败了,所以这可能不是一个好方法。
-
cust_id 或 prod_id 更改时的排名是多少?如果您在示例中也添加它会更好。
标签: sql-server sorting sql-server-2008-r2 dense-rank