【发布时间】: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 |
积分:
-
我正在使用 SQL Server (SSMS)。我试过 lag 但不知道如何选择最后一个特定值
-
数据按id分区,按时间排序
-
之前的标准是 - 我将寻找一个特定的值(在这个例子中我正在寻找值 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