【问题标题】:Alternative for lead() function in SQL Server 5SQL Server 5 中lead() 函数的替代方法
【发布时间】:2021-01-04 00:04:29
【问题描述】:

我想要与窗口函数的前导函数相同的输出。我想为 SQL Server 5.0 版做这件事

表名:表

EventID  CID  Date
123      1    01-12-2020
123      2    01-12-2020
123      3    01-12-2020
345      2    05-12-2020
345      4    05-12-2020
456      1    07-12-2020
456      4    07-12-2020
567      1    08-12-2020

输出

ID      CID     Date       ColumnA
123      1    01-12-2020    07-12-2020
456      1    07-12-2020    08-12-2020
567      1    08-12-2020    Null
123      2    01-12-2020    05-12-2020
345      2    05-12-2020    Null
123      3    01-12-2020    Null
345      4    05-12-2020    07-12-2020
456      4    07-12-2020    Null

【问题讨论】:

  • 请向我们展示您的尝试 - SO 不是代码编写服务。
  • 唯一正确的答案是升级您的 SQL Server。您使用的版本不受支持。
  • @DaleK Select EventID,CID,Date,(Select Max('Date') from table as t group by CID where t.Date
  • “SQL 版本 5”是什么意思? SQL Server 有 2005、2008、2008 R2 版本(所有这些现在不支持)、2012、2014、2016、2017、2019 - 这些都不是“SQL v5” - 请更清楚地说明什么你正在使用
  • @ANSH - 这强烈表明您使用的是mysql,而不是sql-server。首先弄清楚你正在使用什么产品。

标签: sql sql-server sql-server-2005


【解决方案1】:

您可以使用相关子查询来代替无法访问LEAD() 函数:

SELECT
    EventID AS ID,
    CID,
    Date,
    (SELECT TOP 1 t2.Date FROM yourTable t2
     WHERE t2.CID = t1.CID AND t2.Date > t1.Date
     ORDER BY t2.Date) AS ColumnA
FROM yourTable t1
ORDER BY
    CID,
    Date;

Demo

编辑:

您为 SQL Server 标记了您的问题,并解释了您收到此答案和其他答案的原因。如果你的 RDBMS 真的是 MySQL,那么使用这个版本:

SELECT
    EventID AS ID,
    CID,
    Date,
    (SELECT t2.Date FROM yourTable t2
     WHERE t2.CID = t1.CID AND t2.Date > t1.Date
     ORDER BY t2.Date LIMIT 1) AS ColumnA
FROM yourTable t1
ORDER BY
    CID,
    Date;

【讨论】:

  • 当我运行此查询时,它会弹出以下错误:错误代码:1064。您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 5 行的 '1 t2.Date FROM testing.table1 t2 WHERE t2.CID = t1.CID AND t2.Date > t1.Dat' 附近使用正确的语法
  • SQL Server MySQL,但无论如何,请检查我的轻微编辑以获取应该适用于 MySQL 的版本。
  • 它工作正常。惊讶 :) 你能解释一下条件如何帮助找到事件的下一个日期。
  • 子查询在同一 CID 组中查找下一个最大日期。仔细检查逻辑。
  • 当我们运行它时,它会从一个表中将一行映射到另一个表的所有行,并为它获取一个值,我们使用限制 1。我是对的
【解决方案2】:

试试这个:

WITH DataSource AS
(
    SELECT *
          ,ROW_NUMBER() OVER (PARTITION BY [CID] ORDER BY [Date] ASC) AS [RowID]
    FROM [Table] 
)
SELECT DS1.EventID  
      ,DS1.[CID]
      ,DS1.[Date]
      ,DS2.[Date] AS ColumnA
FROM DataSource DS1
LEFT JOIN DataSource DS2
    ON DS1.[RowID] = DS2.[RowID] - 1

【讨论】:

猜你喜欢
  • 2021-10-28
  • 2023-03-05
  • 2016-06-08
  • 2021-09-14
  • 1970-01-01
  • 2017-06-30
  • 1970-01-01
  • 1970-01-01
  • 2016-09-19
相关资源
最近更新 更多