Sql 选择具有分组的最大日期的行名称

Sql 选择具有分组的最大日期的行名称,sql,sql-server,greatest-n-per-group,Sql,Sql Server,Greatest N Per Group,例如: 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 我

例如:

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
我需要为每个[ID]选择[Name],最大值为[Data]。

大概是这样的:

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
但是我想看的不是[Date],而是[Name]

我想看什么

 1          2
1-1        2-2

请帮忙。谢谢。

请尝试以下代码

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
您可以将row_number()与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

您可以尝试以下操作:

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;
你可以在这里看到->

希望这有帮助

试试这个

                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)

谢谢你,但这个不正确。它返回max name,但我需要返回带有max date的name如果您标记dbms,回答起来会容易得多。加上1对于示例数据,我只想添加一件事,就是dbms(如sqlserver/oracle…)和VersionTank you。你说得对。但我也尝试不使用row_number(),因为在非示例select中,我不仅需要返回max date,还需要返回max date in date range您所说的“max date in date range”是什么意思?你能举个例子吗?您可以在生成行号时处理该问题