SQL Server 从列列表中查找最近(非将来)日期

eufgjt7s  于 2022-11-21  发布在  其他
关注(0)|答案(2)|浏览(152)

假设有一个这样的表(实际上我有50个日期列要比较):
| 识别码|我的日期1|我的日期2|年度日期3|
| - -|- -|- -|- -|
| 一个|2022年10月1日|2022年11月1日|2022年12月1日|
| 2个|2022年10月31日|2022年11月31日|2022年12月31日|
对于每条记录,我希望获得最新的、非空的过去日期(小于今天的日期),查看所有日期列。
因此,我希望得到以下结果(给定当前日期2022年11月15日):
| 识别码|最迟日期|
| - -|- -|
| 一个|2022年11月1日|
| 2个|2022年10月31日|
我在其他地方找到了这段代码,但它只是跨列获取最大日期,我需要在某个地方为“max past”添加条件,而不仅仅是“max overall”,但我对CROSS APPLY没有经验,不知道是否可以修改此查询,或者是否有其他方法可以编写它。

SELECT MA.MaxDate
FROM <my_table> AS MT
CROSS APPLY (
 SELECT MAX(VA.LDate)
 FROM (VALUES(MT.MY_DATE_1),(MT.MY_DATE_2),(MT.MY_date_3)) VA(LDate)
) AS MA(MaxDate)
ltskdhd1

ltskdhd11#

您可以在汇总之前进行筛选。以下是一种方法:

select mt.id, max(va.ldate) as maxdate
from my_table as mt
cross apply ( values (mt.my_date_1), (mt.my_date_2), (mt.my_date_3) ) va(ldate)
where va.ldate > getdate()
group by mt.id
yi0zb3m4

yi0zb3m42#

如果不想列出所有50个日期列,可以使用JSON动态地取消数据的枢轴,而不实际使用动态SQL

示例

Select A.ID
      ,B.* 
 From  YourTable A
 Cross Apply  (
                 Select Value = max(Value)
                  From  OpenJson(  (Select A.* For JSON Path,Without_Array_Wrapper )  ) 
                  Where [Key] not in ('ID','OtherColumns','ToExclude')
                    and try_convert(date,value)<=getdate()
              ) B

结果

相关问题