如何将 MS SQL T-SQL 转换为 MySQL 中的后续

How can I convert MS SQL T-SQL into Subsequent in MySQL

这里我有一个 MS SQL 查询,我想将其转换为 MySQL。我不知道怎么处理。

WITH PartitionData as (
  SELECT
    TOP 10 PurchaseDate.PurchaseDate AS date,
    BatchCode,
    ROW_NUMBER() OVER( PARTITION BY PurchaseDate.PurchaseDate ORDER BY ( SELECT NULL ) ) AS RowNumber

  FROM  tblNutBatches
  INNER JOIN PurchaseDate ON PurchaseDate.PurchaseDate BETWEEN tblNutBatches.Introduction_date AND tblNutBatches.expiration_date 
  WHERE  PurchaseDate.PurchaseDate = '2004-05-01'
   
)

SELECT
  date as date,
  [1],
  [2],
  [3],
  [4],
  [5],
  [6],
  [7],
  [8],
  [9]
FROM
  (
    SELECT
      date,
      BatchCode,
      RowNumber
    FROM
      PartitionData
  )AS  DataAfterFilter 
  
  PIVOT 
  (

    MAX(BatchCode) FOR RowNumber IN ([1], [2], [3], [4], [5], [6], [7], [8], [9])
  ) A

OUTPUT IN SQL SERVER

如有任何想法,我们将不胜感激。

您通常会使用条件聚合:

SELECT date,
    MAX(CASE WHEN rn =  1 THEN BatchCode end) as BatchCode1,
    MAX(CASE WHEN rn =  2 THEN BatchCode end) as BatchCode2,
    ...
    MAX(CASE WHEN rn = 10 THEN BatchCode end) as BatchCode10
FROM (
    SELECT 
        pd.PurchaseDate AS date,
        BatchCode,
        ROW_NUMBER() OVER(PARTITION BY pd.PurchaseDate ORDER BY BatchCode) AS rn
    FROM  tblNutBatches nb
    INNER JOIN PurchaseDate pd ON pd.PurchaseDate BETWEEN nb.Introduction_date AND nb.expiration_date 
    WHERE  pd.PurchaseDate = '2004-05-01'
) t
WHERE rn <= 10
GROUP BY date

备注:

  • 如果你想要一致的结果,你需要在子查询和 ROW_NUMBER() 中使用 ORDER BY 子句 - 我使用了 BatchCode

  • BatchCode 前面加上它所属的 table 的别名

  • ROW_NUMBER()PARTITION BY 子句和外部 GROUP BY 子句严格来说不是必需的,因为子查询无论如何都只过滤一个数据;我保留了它们,以防您在某个时候需要删除过滤。因此,我将前 10 个过滤逻辑从子查询移到了外部查询。