以下是我尝试查找具有相同数量的所有订单的数据示例,忽略了OrderID列
Product Location Customer OrderID Quantity
Eggs Chicago XYZ 2011 10
Eggs Chicago XYZ 2012 10
Eggs Chicago XYZ 2013 15
所以,我在SQL中使用了DENSE_RANK函数
Select Product,Location,Customer,OrderID,Quantity,
Ranking = DENSE_RANK() OVER (PARTITION BY Product,Location,Customer,Quantity
ORDER BY OrderID ASC)
FROM MyTable
获取以下数据
Product Location Customer OrderID Quantity Ranking
Eggs Chicago XYZ 2011 10 1
Eggs Chicago XYZ 2012 10 2
Eggs Chicago XYZ 2013 15 1
因此,根据排名,我能够过滤掉不同订单ID中具有相同数量的记录,并将它们视为一个。 到目前为止,一切都很好,我很高兴。但是,另一个疯狂的要求是这种形式的聚合应该只针对数量的第一次变化。例如,如果上面的数据恰好是下面的数据
Product Location Customer OrderID Quantity
Eggs Chicago XYZ 2011 10
Eggs Chicago XYZ 2012 10
Eggs Chicago XYZ 2013 15
Eggs Chicago XYZ 2014 15
Eggs Chicago XYZ 2015 15
相同的SQL会产生结果
Product Location Customer OrderID Quantity Ranking
Eggs Chicago XYZ 2011 10 1
Eggs Chicago XYZ 2012 10 2
Eggs Chicago XYZ 2013 15 1
Eggs Chicago XYZ 2013 15 2
Eggs Chicago XYZ 2013 15 3
但是,我需要结果
Product Location Customer OrderID Quantity Ranking
Eggs Chicago XYZ 2011 10 1
Eggs Chicago XYZ 2012 10 2
Eggs Chicago XYZ 2013 15 1
Eggs Chicago XYZ 2013 15 1
Eggs Chicago XYZ 2013 15 1
请注意,在第一次更改数量后,所有记录的排名仍为1。
是否可以调整我的SQL以获得上述行为?
感谢您的任何建议。
答案 0 :(得分:1)
如果我理解正确,您希望使用DENSE_RANK()
来消除数据中的重复行。
看来你已经解决了问题。如果要消除重复项,请使用上面的相同SQL代码并删除Ranking > 1
的所有行。这将为您留下具有相同唯一键的每行的一个副本(例如Product
,Location
,Customer
,OrderID
)。
答案 1 :(得分:1)
这感觉有点脏,但我认为这是正确的:
SELECT
Product,
Location,
Customer,
OrderID,
Quantity,
DENSE_RANK()
OVER (PARTITION BY
Product,
Location,
Customer,
Quantity
ORDER BY
CASE WHEN
Quantity = (SELECT MIN(Quantity) FROM Orders) THEN OrderID
ELSE 0 END ASC
) AS Ranking
FROM
Orders
请参阅fiddle