【问题标题】:Translate MSSQL query to MySQL 5.7.23将 MSSQL 查询转换为 MySQL 5.7.23
【发布时间】:2019-02-28 10:17:02
【问题描述】:

我在 MSSQL 服务器上运行了一个复杂的 SQL 查询。我需要对其进行更改以使其也可以在 MySQL 数据库上运行,但是我不知道该怎么做。查询如下,用于在 BI 工具中构建复杂的 Sankey 图

    SELECT Id, Delivery_Date, Queue, Step1, Step2, Step3, Step4, Step5, Step6, Step7, 
CONVERT(DECIMAL(16,16),RAND((CHECKSUM(NEWID())))*(1 - 0.999999999)+0.999999999) as Counter
FROM
(SELECT t.ID as Id, t.DELIVERY_DATE as Delivery_Date, t.QUEUE as Queue, CONCAT(t.EVENT_NAME,' ', t.EVENT_STATUS, ' ',t .ENDING) as edsda,
'Step' + cast(row_number() over (partition by ID order by ID)
as varchar(10)) ColumnSeq

FROM (SELECT DISTINCT e.[ID] AS ID,
  e.[DIALOG_DELIVERY_DATE] AS DELIVERY_DATE,
  e.[QUEUE_ID] as QUEUE,
  s2.[STEP_NUMBER] AS STEP_NUMBER,
  s2.[CURRENT_EVENT] AS EVENT_NAME,
  s2.[EVENT_STATUS] as EVENT_STATUS,
  e.[DELIVERY_END] AS DELIVERY_END,
  CASE WHEN s2.[STEP_NUMBER] = max(s2.[STEP_NUMBER]) over (partition by s2.[ID]) 
and s2.[EVENT_NUMBER] = min(s2.[EVENT_NUMBER]) over (partition by s2.[ID], s2.[STEP_NUMBER]) THEN e.[DELIVERY_END] ELSE NULL END as ENDING
FROM [dbo].[DELIVERY_STEP_EVENTS] s1,
[dbo].[DELIVERY_STEP_EVENTS] s2,
[dbo].[DELIVERY_EVENTS] e
WHERE  s1.[ID] =  s2.[ID]
 AND e.[ID] = s2.[ID]
 AND s1.[EVENT_NAME] = s2.[EVENT_NAME]
 AND s1.[STEP_NUMBER] <= s2.[STEP_NUMBER] AS t) AS temp
pivot
(max(edsda)
for ColumnSeq in (Step1,Step2,Step3,Step4, Step5, Step6, Step7)
)
AS Piv

到目前为止,我最大的问题是我不知道如何更改为 MySQL 的 RAND((CHECKSUM(NEWID())))。

任何帮助将不胜感激。

【问题讨论】:

  • 适用于哪个 MySQL 版本? SELECT VERSION();另外你使用的是哪个 SQl Server 版本?
  • 如果只是RAND(checksum(newid)) 部分,那么只需使用RAND()。 MySQL rand 的行为与 MS SQL 不同,它是按行评估的,这正是 RAND(checksum(newid)) 技巧的用途。
  • Stack Overflow 不是免费的代码编写服务,抱歉。如果您只是展示了几个您无法弄清楚如何映射查询的地方,这个问题会更好地表达。
  • MSSQL NEWID() -> MySQL UUID() MSSQL CHECKSUM() -> MySQL CRC32()(最有可能)
  • @user37143 正如我已经解释过的,如果没有 MySQL 8.0,您 无法 模拟该行为。不,变量 hack 无法模拟它

标签: mysql sql sql-server mysql-5.7


【解决方案1】:

到目前为止,我最大的问题是我的 RAND((CHECKSUM(NEWID()))) 不知道怎么改成MySQL。

RAND((CHECKSUM(NEWID()))) 的行为应该与 MySQL 中的 RAND() 函数相同。所以你可以简单地替换这个:

CONVERT(DECIMAL(16,16),RAND((CHECKSUM(NEWID())))*(1 - 0.999999999)+0.999999999)

有了这个:

CAST(RAND() * (1 - 0.999999999) + 0.999999999 AS DECIMAL(16, 16))

【讨论】:

  • 确认它有效,感谢您的帮助。关于over (partition by ( 位,有什么建议吗?我的版本是5.7.23-log
  • 您可以为此使用用户变量(SO 上有很多示例)。如果您可以按 ID 排序结果,则应该没有问题。这是您应该担心的支点。
  • @SalmanA 如何为此使用变量?该查询包含max(s2.[STEP_NUMBER]) over (partition by s2.[ID]) min(s2.[EVENT_NUMBER]) over (partition by s2.[ID], s2.[STEP_NUMBER]) - 按两个 字段进行分区。最后是一个 PIVOT,它的等价物是 GROUP BY 和 FILTER。
猜你喜欢
  • 1970-01-01
  • 2015-03-22
  • 2012-03-22
  • 2012-02-08
  • 1970-01-01
  • 1970-01-01
  • 2022-01-15
  • 1970-01-01
相关资源
最近更新 更多