【问题标题】:Select row name with max date with grouping选择带有分组的最大日期的行名
【发布时间】:2017-09-26 17:13:04
【问题描述】:

例如:

create table #t
(
    [ID] int,
    [Date] date,
    [Name] varchar(5)
)

insert into #t
values
(1, getdate(),'1-1'),
(2, dateadd(D,-10,getdate()),'2-1'),
(2, dateadd(D,-5,getdate()),'2-2'),
(1, dateadd(M,-1,getdate()),'1-2')

select * from #t

我需要为具有最大 [Data] 的每个 [ID] 选择 [Name]。

类似这样的:

select [1], [2]
  from ( select ID, [Date] from #t ) y
  pivot (
    max(y.[Date])
    for y.ID in ([1],[2])
  ) pvt;

输出:

     1            2
2017-04-28   2017-04-23

但我希望看到 [姓名] 而不是 [日期]

我想看什么

 1          2
1-1        2-2

请帮忙。谢谢。

【问题讨论】:

  • 样本数据加 1,只有一件事,我要添加的是 DBMS(如 sqlserver/oracle..)和版本

标签: sql sql-server greatest-n-per-group


【解决方案1】:

试试这个。

                CREATE TABLE #t
                    (
                      [ID] INT ,
                      [Date] DATE ,
                      [Name] VARCHAR(5)
                    )

                INSERT  INTO #t
                VALUES  (1, getdate(),'1-1'),
                (2, dateadd(D,-10,getdate()),'2-1'),
                (2, dateadd(D,-5,getdate()),'2-2'),
                (1, dateadd(M,-1,getdate()),'1-2')

                SELECT  *
                FROM    #t;
                WITH    CTE
                          AS ( SELECT   ID ,
                                        MAX(Date) [Date]
                               FROM     #t
                               GROUP BY ID
                             ),
                        CTE2
                          AS ( SELECT   cte.ID ,
                                        cte.Date ,
                                        t.name
                               FROM     CTE
                                        OUTER APPLY ( SELECT TOP 1
                                                                name
                                                      FROM      #t
                                                      WHERE     (ID = cte.ID AND Date = cte.Date) 
                                                    ) T
                             )
                    SELECT  MAX([1]) [1] ,
                            MAX([2]) [2]
                    FROM    ( SELECT    ID ,
                                        [Date] ,
                                        NAME
                              FROM      CTE2
                            ) y PIVOT ( MAX(y.NAME) FOR y.ID IN ( [1], [2] ) ) pvt

结果

        ID          Date       Name
        ----------- ---------- -----
        1           2017-05-02 1-1
        2           2017-04-22 2-1
        2           2017-04-27 2-2
        1           2017-04-02 1-2

        (4 row(s) affected)

        1     2
        ----- -----
        1-1   2-2


        (1 row(s) affected)

【讨论】:

    【解决方案2】:

    您可以尝试以下方法:

    SELECT          [1], [2]
    FROM            (SELECT         y.ID, 
                                    t.Name
                     FROM           (SELECT     ID, 
                                                MAX([Date]) AS [Date]
                                     FROM       #t
                                     GROUP BY   ID ) y
                    INNER JOIN      #t t ON y.[Date] = t.[Date]
                    ) x
    PIVOT
    (
        MAX(x.Name)
        FOR     x.ID IN ([1],[2])
    ) pvt;
    

    你可以在这里看到这个 -> http://rextester.com/ZGQGSC94965

    希望对你有帮助!!!

    【讨论】:

      【解决方案3】:

      您可以将 row_numbber() 与 date desc 和 pivot 一起使用,如下所示:

      ;with cte as (
      select id, RowN = row_number() over (partition by id order by date desc), name from #t
      ) select * from 
      (select id, name  from cte where rown = 1 ) s
      pivot (max(name) for id in ([1],[2])) p
      

      【讨论】:

      • 谢谢。你说得对。但我也尝试在不使用 row_numbber() 的情况下执行此操作,因为在非示例选择中,我不仅需要返回最大日期,还需要返回日期范围内的最大日期
      • “日期范围内的最大日期”是什么意思?你能提供例子吗?您可以在生成 row_number 时处理它
      【解决方案4】:

      请尝试以下代码

      create table #t
      (
          [ID] int,
          [Date] date,
          [Name] varchar(5)
      )
      
      insert into #t
      values
      (1, getdate(),'1-1'),
      (2, dateadd(D,-10,getdate()),'2-1'),
      (2, dateadd(D,-5,getdate()),'2-2'),
      (1, dateadd(M,-1,getdate()),'1-2')
      
      select [1], [2]
        from ( select ID, [Name] from #t ) y
        pivot (
          max(y.[Name])
          for y.ID in ([1],[2])
        ) pvt;
        drop table #t
      

      【讨论】:

      • 谢谢,但这个不正确。它返回最大名称,但我需要返回最大日期的名称
      • 如果您标记 dbms,它会更容易回答。
      猜你喜欢
      • 2015-05-30
      • 1970-01-01
      • 2022-11-20
      • 2019-01-23
      • 2020-11-16
      • 1970-01-01
      • 2022-01-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多