获取 T-SQL 中最早的日期值对
Get the earliest of a date-value pair in T-SQL
我正在尝试在 t-sql 中构建查询以添加自定义日期值对列。我的数据包含项目 ID、L 日期和 L 状态、N 日期和 N 状态。我知道如何使用 min 函数添加最早的日期。如何在我的新列中捕获最早日期及其相应状态?在下面的示例中,我需要找到最早的一对。我假设的查询应该根据 N 和 L 日期值对中的数据在最早的 Dt 和 Status 中得出结果。
您可以通过横向连接来做到这一点。这个想法是将列取消旋转到列,然后排序:
select t.*, x.*
from mytable t
cross apply (
select top (1) x.*
from (values (t.l_date, t.l_status), (t.n_date, t.n_status)) x(earlierst_dt, status)
order by x.earlierst_dt desc
) x
这是有效的,因为 SQL 服务器在按降序排序时将 null
值放在最后。
您也可以使用 case
表达式,但逻辑输入有点麻烦:
select t.*,
case when l_date > n_date or (l_date is not null and n_date is null) then l_date else n_date end as earlierst_date,
case when l_date > n_date or (l_date is not null and n_date is null) then l_status else n_status end as status
from mytable t
我正在尝试在 t-sql 中构建查询以添加自定义日期值对列。我的数据包含项目 ID、L 日期和 L 状态、N 日期和 N 状态。我知道如何使用 min 函数添加最早的日期。如何在我的新列中捕获最早日期及其相应状态?在下面的示例中,我需要找到最早的一对。我假设的查询应该根据 N 和 L 日期值对中的数据在最早的 Dt 和 Status 中得出结果。
您可以通过横向连接来做到这一点。这个想法是将列取消旋转到列,然后排序:
select t.*, x.*
from mytable t
cross apply (
select top (1) x.*
from (values (t.l_date, t.l_status), (t.n_date, t.n_status)) x(earlierst_dt, status)
order by x.earlierst_dt desc
) x
这是有效的,因为 SQL 服务器在按降序排序时将 null
值放在最后。
您也可以使用 case
表达式,但逻辑输入有点麻烦:
select t.*,
case when l_date > n_date or (l_date is not null and n_date is null) then l_date else n_date end as earlierst_date,
case when l_date > n_date or (l_date is not null and n_date is null) then l_status else n_status end as status
from mytable t