选择带有分组的最大日期的行名

Posted

技术标签:

【中文标题】选择带有分组的最大日期的行名【英文标题】: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..)和版本 【参考方案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,它会更容易回答。

以上是关于选择带有分组的最大日期的行名的主要内容,如果未能解决你的问题,请参考以下文章

从表中选择具有最大日期的行

如何选择具有最大值的行的所有列

如何从数据框中选择一些具有特定行名的行? [关闭]

选择不同的行,同时按最大值分组

SQL:选择具有最大值的行并按单列分组

通过分组选择最大日期?