你能在 DENSE_RANK() OVER PARTITION 中得到两个相同的 order_position(或行号)吗?

Can you get two identical order_position (or row number) in DENSE_RANK() OVER PARTITION?

我的问题:下面的代码 circumstance/condition 会 return 两个相同的行,都具有 ORDER_POSITION=1.

不幸的是,我无法重现我的问题,但早些时候我正在处理一个生产问题,其中我的查询 returning 重复。这是两个相同的记录,两者的 ORDER_POSITION=1 。这怎么可能?即使所有列都相同,这不应该是 return 两个相同的行,但订单位置不同吗? (行号)?

WITH CTE AS 
(
SELECT A.Name, 
       A.Device,
       CONVERT(DATETIME, A.ORDERDATE, 120) AS ORDER_DATE,  
       ORDER_TIME,
       A.ORDER_BDATE,
       A.ORDER_BTIME,
       Product,
       A.PR_ID
FROM MyTable A
WHERE 
      A.Product = 'GPS' AND
      A.[STATUS] ='ACTIVE'
  )

SELECT R.*
FROM (
SELECT A.*,
       DENSE_RANK() OVER (PARTITION BY A.Name ORDER BY A.ORDER_DATE DESC, A.ORDER_TIME DESC) AS ORDER_POSITION
FROM CTE A) R

如果两行具有相同的 a.nameA.ORDER_DATEA.ORDER_TIME,则 dense_rank 将给它们相同的数字。

Dense_rank 使用 partition by 子句中提到的列对行进行分组,并尝试使用 order by 子句中的列将数字赋予行。但是,如果同一组中的两行在 order by 子句中使用的列中具有相同的值,则会为它们提供相同的数字。

如果您想要不同的数字,请使用 row_number 而不是 dense_rank

DENSE_RANK() 将 return 相同的值,如果使用您的示例,ORDER_DATEORDER_TIME 的多个记录具有相同的值 A.Name

您可能想使用 ROW_NUMBER() 为重复案例生成唯一编号