【问题标题】:How to get a particular preceding value of a column in SQL [closed]如何在 SQL 中获取列的特定先前值 [关闭]
【发布时间】:2021-10-18 00:40:53
【问题描述】:

我希望每条记录都有一个新列,其时间对应于特定的先前值。

输入:

id value datetime
1 1 1-1-2019 10:00 AM
1 2 1-1-2019 10:15 AM
1 2 1-1-2019 10:30 AM
1 3 1-1-2019 10:45 AM
2 2 1-1-2019 11:00 AM
2 5 1-1-2019 11:15 AM
2 6 1-1-2019 11:30 AM

输出: time2 对应于特定的先前值。 (EX.值=2)

id value datetime datetime2
1 1 1-1-2019 10:00 AM NULL
1 2 1-1-2019 10:15 AM NULL
1 2 1-1-2019 10:30 AM 1-1-2019 10:15 AM
1 3 1-1-2019 10:45 AM 1-1-2019 10:30 AM
2 2 1-1-2019 11:00 AM NULL
2 5 1-1-2019 11:15 AM 1-1-2019 11:00 AM
2 6 1-1-2019 11:30 AM 1-1-2019 11:00 AM

积分:

  1. 我正在使用 SQL Server (SSMS)。我试过 lag 但不知道如何选择最后一个特定值

  2. 数据按id分区,按时间排序

  3. 之前的标准是 - 我将寻找一个特定的值(在这个例子中我正在寻找值 2)。如果分区中先前存在值 2,则它将返回其对应的时间,否则为 NULL

*用真实值更新时间

最初我想到了滞后函数,但问题是滞后函数只能接受低于 3 个参数 -

第一个参数是列名 - 但这里我在 value 列中搜索特定值并返回 time 列,所以不确定将哪个列作为第一个参数传递

第二个参数是偏移量 - 滞后函数使用此参数放弃落后的行数。但在这种情况下,不固定 value=2 背后的放弃程度。

第三个参数是默认值 - 例如,我们为第一行指定偏移值 3。滞后函数不能落后三行。如果指定,它将显示默认值。如果我们不为此指定任何值,则滞后函数在输出中显示 NULL 以表示超出范围的值

【问题讨论】:

  • 提问时,您需要提供minimal reproducible example: (1) DDL 和样本数据填充,即 CREATE 表和 INSERT SQL 语句。 (2) 你需要做什么,即逻辑和你的代码尝试在 SQL 中实现它。 (3) 期望的输出,基于上面#1 中的样本数据。 (4) 您的数据库供应商和数据库版本。全部在问题内,没有图片。
  • 您使用的是 MySQL 还是 MS SQL Server?答案可能是特定于产品的。
  • 查看LAG
  • 向我们展示您的延迟尝试,解释为什么它们不起作用。
  • 现在,如果您只是向我们展示您的非工作延迟尝试,您将有一个完整的问题。虽然如果您想让回答变得非常容易,请将您的输入数据添加为 DDL+DML 以节省我们输入的时间。

标签: sql sql-server tsql


【解决方案1】:

value = 2 时,您可以使用运行的、有条件的MAX 来获取最新的datetime 值。

您可以使用ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING排除当前行

SELECT
  t.id,
  t.value,
  t.datetime,
  datetime2 = MAX(CASE WHEN t.value = 2 THEN t.datetime END)
       OVER (PARTITION BY t.id ORDER BY t.datetime ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING)
FROM YourTable t;

SQL Fiddle

【讨论】:

    【解决方案2】:

    使用内部选择,您可以将当前行与之前的值与您想要的规范结合起来。

    检查条件:where t2.id = t1.id and t2.value = 2 and t1.datetime > t2.datetime

    select *,(select max(datetime) from YourTable t2 where t2.id = t1.id and t2.value = 2 and t1.datetime > t2.datetime)
    from YourTable t1
    

    【讨论】:

    • 对您的答案如何工作的一些解释将极大地批准这个答案。 OP 应该能够从中学习,而不仅仅是复制/过去并很高兴它有效。
    • 我几乎无法理解这个问题,所以我可以找到答案。但我几乎无法进入解释。
    猜你喜欢
    • 1970-01-01
    • 2016-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-06
    • 2021-12-04
    • 2015-07-08
    相关资源
    最近更新 更多