row_number() Group by?

53

我有一个数据集,其中包含列 DateCatQTY。我的目标是添加一个唯一的列,当进行行计数时,只计算唯一的 Cat 值。以下是我想要的结果:

enter image description here

通过使用下面的 SQL 查询,我能够使用 row_number() 函数获取行号。

然而,我无法得到上面所示的唯一列。当我在 OVER 子句中添加 group by 时,它不起作用。有人有什么想法,如何让这个唯一的计数列起作用吗?

SELECT 
   Date,    
   ROW_NUMBER() OVER (PARTITION BY Date ORDER By Date, Cat) as ROW,
   Cat,
   Qty
FROM SOURCE
2个回答

53

这里有一个解决方案。

你不需要担心Cat的顺序。使用以下SQL,你将能够获取你的日期和猫组合的唯一值。

SELECT 
   Date,    
   ROW_NUMBER() OVER (PARTITION BY Date, Cat ORDER By Date, Cat) as ROW,
   Cat,
   Qty
FROM SOURCE

22
DENSE_RANK() OVER (PARTITION BY date ORDER BY cat)

谢谢,这是朝着正确方向迈出的一步。然而,事实是我的实际数据集并没有按照cat排序。你知道在这个例子中如何运作吗?(想象一下,在我的cat列中,DEF在ABC之前。但是确实DEF值在我的排序中都是连续的,所以你不会在cat列中看到DEF,DEF,ABC,ABC,DEF作为值) - user1582928
2
根据http://msdn.microsoft.com/en-us/library/ms173825.aspx所述,"<order_by_clause>确定在分区中应用DENSE_RANK函数的行的顺序"。而且你总是可以在SELECT语句的末尾添加ORDER BY。 - prashanth
@user1582928,如果您想要指定一个函数来改变顺序,例如:order by decode('DEF',1,'ABC',2,3)。 - Nahuel Fouilleul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接