【问题标题】:How can I use OVER and ORDER BY如何使用 OVER 和 ORDER BY
【发布时间】:2012-04-19 04:46:48
【问题描述】:

我无法理解这段代码的错误。

代码:

SELECT
    CariID, HesapID, BTrh, BCinsiID, BNo, Acklm, VdTrh, mTrh, BorcT, AlacakT, 
    SUM(BorcT) OVER (PARTITION BY CariID, HesapID ORDER BY BTrh, BNo, mTrh) AS TopBorcT, 
    SUM(AlacakT) OVER (PARTITION BY CariID, HesapID ORDER BY BTrh, BNo, mTrh ) AS TopAlacakT
FROM
    tCariH

错误:

消息 102,级别 15,状态 1,第 3 行

'order' 附近的语法不正确。

【问题讨论】:

  • SQL Server 的哪个版本?我相信您展示的语法仅适用于 2012 年(可能还有更高版本,尚不存在)

标签: sql sql-server sum sql-order-by window-functions


【解决方案1】:

使用 SUMyou don't use ORDER BY in the OVER clause 之类的聚合函数 - 您只需使用 PARTITION 函数。 ORDER 用于排名函数:

根据与 OVER 子句一起使用的排名、聚合或分析函数,可能不支持<ORDER BY clause> 和/或<ROWS and RANGE clause>

只需修改以删除两个聚合中的ORDER,就可以了。

【讨论】:

  • 可以将 ORDER BY 与 sum() 或 avg() 一起使用。然后它将创建一个直到“当前行”的“运行”总和(或平均值)。除非 Oracle 和 PostgreSQL SQL Server 直到现在才支持它。只有全新的 SQL Server 2012 才支持此功能
  • @a_horse_with_no_name - 感谢您的信息,我没有意识到它在 2012 年发生了变化
  • ID AccountID 数量 1 1 10 Sum = 10 2 1 5 = 10 + 5 = 15 3 1 2 = 10 + 5 + 2 = 17 4 2 7 = 7 5 2 3 = 7 + 3 = 10 SELECT ID, AccountID, Quantity, SUM(Quantity) OVER (PARTITION BY AccountID) AS TopBorcT, FROM tCariH
【解决方案2】:
ID      AccountID       Quantity
1          1               10           Sum = 10
2          1               5                = 10 + 5 = 15
3          1               2                = 10 + 5 + 2 = 17
4          2               7                = 7
5          2               3                = 7 + 3 = 10  

SELECT ID, AccountID, Quantity, 
       SUM(Quantity) OVER (PARTITION BY AccountID ) AS TopBorcT, 
FROM tCariH

【讨论】:

    【解决方案3】:

    显然这在 SQL Server 2008 中不支持,但在 SQL Server 2012 中支持

    How to use partition by and order by in over function?

    试试这个工具,你就会明白为什么: http://sqlfiddle.com/#!6/5303f/1

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多