目前,我按产品名称排列了SQL,并按开始日期排序。我现在要做的是按组,行,样式分组(我希望最终得到4行,样式27823有2行)这就是为什么我试图包含一个等级,所以我也可以按此分组..但它显然,27823风格的等级为1,所以我仍然得到3行。
SELECT
PS.SECTION_NAME [Planning Group],
PR.ROW_NAME [Planning Row],
P.PRODUCT_NAME [Style],
(SD.START_DATE) [Start dt],
dense_rank() OVER (ORDER BY P.PRODUCT_NAME) rank_
FROM
tables_
Order by
PS.SECTION_NAME,
PR.ROW_NAME,
SD.START_DATE
我有什么:
Group Row Style Start dt rank_
SEW LS-1-A 27823 2015-12-12 1
SEW LS-1-A A8AR 2015-12-13 2
SEW LS-1-A NFJ3BH03 2016-01-06 3
SEW LS-1-A 27823 2016-02-17 1
SEW LS-1-A 27823 2016-03-03 1
SEW LS-1-A 27823 2016-03-12 1
SEW LS-1-A 27823 2016-03-20 1
SEW LS-1-A 27823 2016-03-24 1
我想获得' NEW_RANK_COLUMN'工作,所以我可以分组。
Group Row Style Start dt rank_ NEW_RANK_COLUMN
SEW LS-1-A 27823 2015-12-12 1 1
SEW LS-1-A A8AR 2015-12-13 2 2
SEW LS-1-A NFJ3BH03 2016-01-06 3 3
SEW LS-1-A 27823 2016-02-17 1 4
SEW LS-1-A 27823 2016-03-03 1 4
SEW LS-1-A 27823 2016-03-12 1 4
SEW LS-1-A 27823 2016-03-20 1 4
SEW LS-1-A 27823 2016-03-24 1 4
我想要获得的结果是:
Group Row Style
SEW LS-1-A 27823
SEW LS-1-A A8AR
SEW LS-1-A NFJ3BH03
SEW LS-1-A 27823
答案 0 :(得分:2)
您希望在定义排名时考虑日期 - 保持连续值相同。一种方法是使用lag()
查看值何时更改,然后获取该值的累积总和:
SELECT PS.SECTION_NAME [Planning Group], PR.ROW_NAME as [Planning Row],
P.PRODUCT_NAME [Style], (SD.START_DATE) as [Start dt],
SUM(isChange) OVER (PARTITION BY group ORDER BY start_dt) as rank_
FROM (SELECT t.*,
(CASE WHEN lag(row) over (partition by group order by start_dt) = row
THEN 0
ELSE 1
END) as IsChange
FROM tables_ t
) t
Order by PS.SECTION_NAME, PR.ROW_NAME, SD.START_DATE;
这些功能适用于SQL Server 2012+。在早期版本中,您可以使用outer apply
执行类似操作。