首页 > 解决方案 > SQL Server - 创建在行中具有 2 个最大值的子集表

问题描述

我有一个只有一行的表(11 列)。它包含以下记录:

ID   Data_Type  Value1      Value2      Value3      Value4      Value5      Value6      Value7      Value8      Value9      
1    A_1        08/03/2020  08/03/2020  08/03/2020  08/02/2021  08/02/2021  08/02/2021  08/09/2022  08/09/2021  08/09/2024

我需要一个包含以下记录的子表(只有 2 列具有最新的日期值)

ID  Data_Type   Value9      Value7
1   A_1         08/09/2024  08/09/2022

请帮忙。

标签: sqlsql-serversql-server-2012

解决方案


您可以使用APPLY然后使用一些聚合逻辑来反透视数据:

select t.id, t.data_type, v.*
from t cross apply
     (select max(case when seqnum = 1 then date end) as date_1,
             max(case when seqnum = 1 then value end) as date_1,
             max(case when seqnum = 2 then date end) as date_2,
             max(case when seqnum = 2 then value end) as date_2             
      from (select v.*, row_number() over (order by value desc) as seqnum
            from (values (t.value1, 'value1'),
                         (t.value2, 'value2'),
                         (t.value3, 'value3'),
                         . . .
                 ) v(date, value)
           ) v
     ) v;

非常重要的注意事项:这增加了列,而不是列。具有最大值和倒数第二个值的列的名称位于单独的列中。如果使用动态 SQL,则只能控制列的名称。

以上将在一行上正常工作。但它也适用于多行。


推荐阅读