在交叉应用中获取最大row_number

时间:2013-04-10 17:14:32

标签: sql sql-server sql-server-2012 row-number cross-apply

我在计算sql case中row_number的最大值时遇到了麻烦。

我将直接在SQL Fiddle示例中解释它,因为我认为理解起来会更快:SQL Fiddle

  • 列'OrderNumber','HourMinute'和'Code'仅代表我的表格,因此不应与编码目的相关
  • 列'DateOnly'包含日期
  • 列'手机'包含我客户的手机
  • 列'购买'包含客户在过去12个月内购买的次数。请注意,此值是针对每个日期提供的,因此12个月的时间段与我们评估的日期相关。

最后,我试图制作的专栏是'PREVIOUSPURCHASES',用于计算“购买”栏中提供的数字在过去12个月(每部手机)中出现的次数。

你可以在SQL Fiddle示例中看到我到目前为止所取得的成就。 “PREVIOUSPURCHASES”栏目正在产生我想要的东西,但是,它也产生了较低的值(例如,只有最大值是我需要的值)。

例如,您可以看到第4行和第5行是重复的,其中一行的'PREVIOUSPURCHASES'为1,另一行为2.我不想拥有第4行,在这种情况下。

我有关于将row_number替换为max(row_number)之类的内容,但是我无法生成它(已经在stackoverflow上看了类似的帖子......)。

这应该在SQL Server 2012中实现。

提前致谢。

1 个答案:

答案 0 :(得分:1)

我不确定你想看到什么样的结果集,但是这个结果有什么问题吗?

SELECT c.OrderNumber, c.DateOnly, c.HourMinute, c.Code, c.Phone, c.Purchases, MAX(o.PreviousPurchases)
FROM cte c CROSS APPLY (
                      SELECT t2.DateOnly, t2.Phone,t2.ordernumber, t2.Purchases, ROW_NUMBER() OVER(PARTITION BY c.DateOnly ORDER BY t2.DateOnly) AS PreviousPurchases
                      FROM CurrentCustomers_v2 t2
                      WHERE c.Phone = t2.Phone AND t2.purchases<=c.purchases AND DATEDIFF(DAY, t2.DateOnly, c.DateOnly) BETWEEN 0 AND 365
                      ) o
WHERE c.OrderNumber = o.OrderNumber
GROUP BY c.OrderNumber, c.DateOnly, c.HourMinute, c.Code, c.Phone, c.Purchases
ORDER BY c.DateOnly