【问题标题】:SQL: Using CASE and returning only max valueSQL:使用 CASE 并仅返回最大值
【发布时间】:2013-09-04 19:41:17
【问题描述】:

对于此问题中的任何新手遗漏或晦涩之处,请先致歉。

我有两张表要在某个日期加入。

Table1:
Closing Date
2013-04-26 00:00:00.000
2013-01-26 00:00:00.000

Table2:
Price Date
2013-04-24 00:00:00.000
2013-04-25 00:00:00.000
2013-04-26 00:00:00.000
2013-01-22 00:00:00.000
2013-01-23 00:00:00.000
2013-01-24 00:00:00.000

我只想为 Table1 中的每个日期从 Table2 中提取最近的日期(前 5 天内),然后将其分配为“MATCH”或“NONMATCH”。

我有以下代码

CASE Table2.PricingDate 
    WHEN Table1.[ClosingDate] THEN 'MATCH'
    WHEN DATEADD(D,-1, Table1.[ClosingDate]) THEN 'NONMATCH'
    WHEN DATEADD(D,-2, Table1.[ClosingDate]) THEN 'NONMATCH'
    WHEN DATEADD(D,-3, Table1.[ClosingDate]) THEN 'NONMATCH'
    WHEN DATEADD(D,-4, Table1.[ClosingDate]) THEN 'NONMATCH'
    WHEN DATEADD(D,-5, Table1.[ClosingDate]) THEN 'NONMATCH'
END [Match]

FROM Table2 INNER JOIN Table1
    ON Table2.PricingDate 
           BETWEEN DATEADD(D,-5,Table1.[ClosingDate]) AND Table1.[ClosingDate]

    WHERE
    CASE Table2.PricingDate 
        WHEN Table1.[ClosingDate] THEN 'MATCH'
        WHEN DATEADD(D,-1, Table1.[ClosingDate]) THEN 'NONMATCH'
        WHEN DATEADD(D,-2, Table1.[ClosingDate]) THEN 'NONMATCH'
        WHEN DATEADD(D,-3, Table1.[ClosingDate]) THEN 'NONMATCH'
        WHEN DATEADD(D,-4, Table1.[ClosingDate]) THEN 'NONMATCH'
        WHEN DATEADD(D,-5, Table1.[ClosingDate]) THEN 'NONMATCH'
    END  IS NOT NULL

问题是这会为每个 ClosingDate 返回多个 PricingDate:

**Closing Date            Price Date                Match**
2013-04-26 00:00:00.000   2013-04-24 00:00:00.000   NONMATCH
2013-04-26 00:00:00.000   2013-04-25 00:00:00.000   NONMATCH
2013-04-26 00:00:00.000   2013-04-26 00:00:00.000   MATCH
2013-01-26 00:00:00.000   2013-01-22 00:00:00.000   NONMATCH
2013-01-26 00:00:00.000   2013-01-23 00:00:00.000   NONMATCH
2013-01-26 00:00:00.000   2013-01-24 00:00:00.000   NONMATCH

我只希望它返回:

**Closing Date            Price Date                Match**
2013-04-26 00:00:00.000   2013-04-26 00:00:00.000   MATCH
2013-01-26 00:00:00.000   2013-01-24 00:00:00.000   NONMATCH

我怎样才能让它为每个关闭日期只返回一个定价日期? 非常感谢您的帮助!

【问题讨论】:

    标签: sql case where


    【解决方案1】:

    假设您使用的是 SQL Server:

    select
        T1.[Closing Date], T2.[Price Date],
        case
            when T1.[Closing Date] = T2.[Price Date] then 'MATCH'
            else 'NONMATCH'
        end as [Match]
    from Table1 as T1
        outer apply (
            select top 1 T2.[Price Date]
            from Table2 as T2
            where
                T2.[Price Date] <= T1.[Closing Date] and
                T2.[Price Date] >= dateadd(day, -5, T1.[Closing Date])
                -- you can use between, I just like >= <= syntax more
                -- T2.[Price Date] between T1.[Closing Date] and dateadd(day, -5, T1.[Closing Date])
            order by T2.[Price Date] desc
        ) as T2
    

    => sql fiddle demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-30
      • 2021-12-28
      相关资源
      最近更新 更多