2017-07-30 40 views
1

您能否请帮助我如何获得预期的输出,如下面的屏幕截图所示?无法使用密集等级获得期望的输出

DECLARE @TT TABLE (CUSTOMERID INT, TYPE VARCHAR(100) , D1 DATE) 
INSERT INTO @TT VALUES (15001,'TYPE1', '4/1/2017') 
INSERT INTO @TT VALUES (15001,'TYPE1', '4/2/2017') 
INSERT INTO @TT VALUES (15001,'TYPE1', '4/3/2017') 
INSERT INTO @TT VALUES (15001,'NON TYPE1', '4/4/2017') 
INSERT INTO @TT VALUES (15001,'NON TYPE1', '4/5/2017') 
INSERT INTO @TT VALUES (15001,'NON TYPE1', '4/6/2017') 
INSERT INTO @TT VALUES (245,'Non TYPE1', '4/1/2017') 
INSERT INTO @TT VALUES (245,'Non TYPE1', '4/2/2017') 
INSERT INTO @TT VALUES (245,'Non TYPE1', '4/3/2017') 
INSERT INTO @TT VALUES (245,'TYPE1', '4/4/2017') 
INSERT INTO @TT VALUES (245,'TYPE1', '4/5/2017') 
INSERT INTO @TT VALUES (245,'TYPE1', '4/6/2017') 

查询是:

SELECT * , 
     DENSE_RANK() OVER (PARTITION BY CUSTOMERID ORDER BY CUSTOMERID,TYPE) DR 
FROM @TT 
WHERE CUSTOMERID = 15001 
ORDER BY CUSTOMERID,D1 

SELECT *, 
     DENSE_RANK() OVER (PARTITION BY CUSTOMERID ORDER BY CUSTOMERID,TYPE) DR 
FROM @TT 
WHERE CUSTOMERID = 245 
ORDER BY CUSTOMERID,D1 

enter image description here

谢谢你的帮助。

+0

使用'ORDER BY TYPE DESC' –

+0

是的,我知道这一点,但实际的数据同时具有ASC和DESC类型的场景组合。所以不能使用这个。 我修改了有问题的示例数据以突出场景 – Ram

回答

1

您想按最短日期排序。我认为这是这样的:

SELECT t.*, 
     DENSE_RANK() OVER (PARTITION BY CUSTOMERID ORDER BY mind1, TYPE) DR 
FROM (SELECT t.*, MIN(d1) OVER (PARTITION BY CUSTOMERID, TYPE) as mind1 
     FROM @TT t 
    ) t 
WHERE CUSTOMERID = 15001 
ORDER BY CUSTOMERID, D1; 

这种假定类型不交错(如在你的例子)。如果是这种情况,那么请提出另一个问题。这显着改变了这个问题。这个问题也应该提供更好的样本数据和期望的结果。

+0

完美。谢谢Gordon的帮助。 – Ram