开发者社区> 问答> 正文

时态表通过奇怪的模式检索具有不同顺序的分区行集

我正在解决基于Adventure Works 2012的任务。

对于每个会计年度(2007年和2008年),请查找第一个日期,即当年累计营业收入达到1000万美元。

输出应包括以下几列:

会计年度(2007或2008)。 达到或超过1000万美元的订单日期。 在达到或超过1000万美元的会计年度内的订单计数(例如,如果在第50个订单上达到了1000万美元的目标,则报告的适当值为50)。 达到1000万美元目标的订单ID。 达到或超过1000万美元的总营业收入。 DROP TABLE #data SELECT YEAR(DATEADD(MONTH, 6, OrderDate)) FiscalYear, CAST(OrderDate AS DATE) OrderDate, SalesOrderID OrderID, COUNT(*) OVER(Partition BY YEAR(DATEADD(MONTH, 6, OrderDate)) ORDER BY SalesOrderID) OrderCount, SUM(SubTotal) OVER(Partition BY YEAR(DATEADD(MONTH, 6, OrderDate)) ORDER BY SalesOrderID) RunTotal INTO #data FROM sales.SalesOrderHeader WHERE YEAR(DATEADD(MONTH, 6, OrderDate)) IN (2007, 2008)

SELECT TOP 1 FiscalYear, OrderDate, OrderCount, OrderID, RunTotal FROM #data WHERE RunTotal>=10000000 AND FiscalYear=2007 UNION SELECT TOP 1 FiscalYear, OrderDate, OrderCount, OrderID, RunTotal FROM #data WHERE RunTotal>=10000000 AND FiscalYear=2008 临时表#data检索由FiscalYear分区并在该分区内按OrderID排序的正确集,以进行3次连续执行,并在以下UNION查询中呈现正确的结果,在 此处输入图像描述

但是随后,在接下来的两次执行中,顺序被打乱了:数千个2008 FiscalYear行推高了记录集,而无视COUNT顺序,并且2008(TOP 1)的结果变得不正确,请 在此处输入图像描述

然后它会恢复正常执行3次,依此类推。每当我擦除

SUM(SubTotal) OVER(Partition BY YEAR(DATEADD(MONTH, 6, OrderDate)) ORDER BY SalesOrderID) RunTotal 从时态表中,顺序工作正常。我对这种奇怪的行为感到困惑。

问题来源于stack overflow

展开
收起
保持可爱mmm 2019-11-18 10:01:48 504 0
1 条回答
写回答
取消 提交回答
  • TOP没有则该子句毫无意义ORDER BY。在您的查询中,您说的是“从FiscalYear xxxx和RunTotal> = 10000000的所有结果行中任意选择一行”。这样做的原因是表数据被认为是无序的数据集。没有ORDER BY就没有保证的顺序。

    因此:

    SELECT * FROM ( SELECT TOP 1 FiscalYear, OrderDate, OrderCount, OrderID, RunTotal FROM #data WHERE RunTotal >= 10000000 AND FiscalYear = 2007 ORDER BY RunTotal ) year2007 UNION ALL SELECT * FROM ( SELECT TOP 1 FiscalYear, OrderDate, OrderCount, OrderID, RunTotal FROM #data WHERE RunTotal >= 10000000 AND FiscalYear = 2008 ORDER BY RunTotal ) year2008; 我已更改UNION为UNION ALL,因为没有要删除的重复项。

    查询结果还是一个表。因此,同样的规则适用:如果您想要某些特定的订单,则需要ORDER BY。如果希望2007年在2008年之前,请添加ORDER BY FiscalYear到查询的末尾。

    2019-11-18 10:01:59
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
RowKey与索引设计:技巧与案例分析 立即下载
事务、全局索引、透明分布式 立即下载
Phoenix 全局索引原理与实践 立即下载