选择带有分组的最大日期的行名
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,它会更容易回答。以上是关于选择带有分组的最大日期的行名的主要内容,如果未能解决你的问题,请参考以下文章