【问题标题】:MySQL Convert ROW_NUMBER() OVER PARTITION [duplicate]MySQL转换ROW_NUMBER()OVER PARTITION [重复]
【发布时间】:2018-04-02 19:41:58
【问题描述】:

我正在尝试将 MSSQL 数据库转换为 MySQL,我的版本是 5.7。我遇到了障碍。

SELECT orderid, invs.[InvoiceID],  invs.[InvoiceDate],
invs.[InvoiceNumber], invs.[HasClientPaid],
ROW_NUMBER() OVER (PARTITION by orderid,invs.invoicenumber,HasClientpaid ORDER BY orderid) AS DistNum 
FROM InvoiceLineItems Ilt 
JOIN Invoices Invs ON Ilt.InvoiceID= invs.InvoiceID

任何帮助将不胜感激。谢谢

【问题讨论】:

    标签: mysql sql-server


    【解决方案1】:

    MySQL 将在 8.x 版本中开始支持诸如 row_number() 之类的窗口函数(截至 2017 年 10 月 29 日尚未准备好生产),在此之前使用 @variables 是一种模仿效果:

    SELECT
          @row_num :=IF(@prev_value=concat_ws('',orderid, invs.invoicenumber, HasClientpaid),@row_num+1,1)AS RowNumber
        , orderid
        , invs.[InvoiceID]
        , invs.[InvoiceDate]
        , invs.[InvoiceNumber]
        , invs.[HasClientPaid]
        , @prev_value := concat_ws('',orderid, invs.invoicenumber, HasClientpaid)
    FROM InvoiceLineItems Ilt
    JOIN Invoices Invs ON Ilt.InvoiceID = invs.InvoiceID
    CROSS JOIN (SELECT @row_num :=1,  @prev_value :=0) vars
    ORDER BY
          orderid, invs.invoicenumber, HasClientpaid
    ;
    

    您需要连接 3 个字段 orderid, invs.invoicenumber, HasClientpaid 以模仿您的原始分区,并且还需要按这 3 列进行排序。 ORDER BY 对于此工作至关重要,如果您需要其他一些最终排序,请使用上述作为子查询。

    【讨论】:

    • 您的问题现在解决了吗?你对这个答案还有疑问吗?要接受答案“Click the Tick”了解更多信息,请参阅help/accepting
    • 为什么要交叉连接?我知道子查询会初始化那些 row_num 和 prev_value 变量,但为什么要使用交叉连接呢?
    • 交叉连接只是添加了 2 个新列。另请注意,因为它只有一行,所以交叉连接不会增加总行数。
    • 谢谢保罗,非常感谢!
    • 顺便说一下,在这个 MySQL 技术的许多旧示例中,您可能会发现额外列的子查询只是在 from 子句中列出,但用逗号分隔,该子查询在where 子句。这与显式交叉连接具有相同的效果,但我不建议将这种古老的语法与显式连接混合。恕我直言,更好的是明确并表明一个人正在使用交叉连接。
    猜你喜欢
    • 2018-07-25
    • 1970-01-01
    • 2018-10-16
    • 2021-03-03
    • 1970-01-01
    • 2013-02-24
    • 1970-01-01
    • 2019-04-13
    • 1970-01-01
    相关资源
    最近更新 更多