使用窗口函数查询稍微不同的over子句,删除表假脱机

问题描述

我有这个查询,我找不到我想要的计划。

我的查询如下:

行被放在不同的组中(按分区),我想从每一组中选择一行,并使用row_number分配优先级。 我还需要一个标志,该标志是每个组中所有行的汇总。

SELECT *
FROM (
  SELECT  [ProductReviewID],[ProductID],[ReviewerName],[ReviewDate],[rating],[Comments],[ModifiedDate],ROW_NUMBER() over (partition by ProductID order by ReviewDate) as Prio,min(rating) over (partition by ProductID) as Flag
    FROM [AdventureWorks2008R2].[Production].[ProductReview]
) x
WHERE Prio = 1 and Flag >= 2

生成的计划如下所示(query1): https://1drv.ms/u/s!Auamqfb9LjGpaoxpkRpYS3iIVbE 问题是表线轴。 我想要的计划看起来像Query2,在其中,将供稿分类一个窗口假脱机中(我无法显示确切的计划,因为我没有sql2016的开发服务器)。

select ... <- window spool <- sort <- ... 出现问题是因为优化器不够聪明,以至于无法看到一种类型(ProductId,ReviewDate)对两个窗口函数都适用。

如果使over子句相同,我可以得到我想要的计划(这应该为您提供一个如上所述的计划):

,min(rating) over (partition by ProductID  order by ReviewDate) as Flag

但这以不符合此处要求的逻辑的方式更改了min()的结果。

有什么想法吗?感谢您的帮助。

编辑:这就是我在lptrs帮助下所拥有的,窍门是将一个“虚拟”列作为第一个排序依据。我认为这是答案。谢谢。

,ROW_NUMBER() over (partition by ProductID order by ProductID,ReviewDate) as Prio,min(rating) over (partition by ProductID  order by ProductID) as Flag

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)