[英]Select column value corresponding to MAX column value
I have a table Person, date is in yyyymmDD
format and time is is hhmmssSSS
format 我有一个表Person,日期为yyyymmDD
格式,时间为hhmmssSSS
格式
ID NAME CREATEDDATE CREATEDTIME
1 A 20170205 135744300
2 B 20160205 113514368
3 C 20090205 163054942
4 A 20150205 135744301
Now I want to get count of each person and maximum createddate and CORRESPONDING createdTIME in a single query 现在,我想在单个查询中获取每个人的数量以及最大createddate和CORRESPONDING createdTIME
I tried 我试过了
SELECT NAME, COUNT (ID) AS COUNT, MAX(CREATEDDATE), MAX(CREATEDTIME)
FROM Person
but this gives me maximum date and maximum time from each column, it does not give me CREATEDTIME corresponding to MAX(CREATEDDATE) 但这给了我每一列的最大日期和最大时间,它没有给我对应于MAX(CREATEDDATE)的CREATEDTIME
eg 例如
The query results is 查询结果是
NAME COUNT MAXCREATEDDATE CORRESPONDINGCREATEDTIME
A 2 20170205 135744301
The CORRESPONDINGCREATEDTIME
should be 135744300
CORRESPONDINGCREATEDTIME
应该为135744300
Please help me do it 请帮我做
You could do this simply with a subquery that finds the max date for each Name and perform an inner join. 您可以使用子查询简单地做到这一点,该子查询可以找到每个Name的最大日期并执行内部联接。
Test Data 测试数据
CREATE TABLE #Person (ID int, Name varchar(1), CreatedDate int, CreatedTime int)
INSERT INTO #Person (ID, Name, CreatedDate, CreatedTime)
VALUES
(1,'A',20170205,135744300)
,(2,'B',20160205,113514368)
,(3,'C',20090205,163054942)
,(4,'A',20150205,135744301)
Query 询问
SELECT
a.Name
,b.CtName CountName
,a.CreatedDate
,a.CreatedTime
FROM #Person a
JOIN (
SELECT
Name
,COUNT(Name) CtName
,MAX(CreatedDate) MaxDate
FROM #Person
GROUP BY Name
) b
ON a.Name = b.Name
AND a.CreatedDate = b.MaxDate
Result 结果
Name CountName CreatedDate CreatedTime
A 2 20170205 135744300
B 1 20160205 113514368
C 1 20090205 163054942
Try this answer, 试试这个答案,
SELECT NAME, COUNT(ID) AS COUNT, max(CREATEDDATE), max(CREATEDTIME)
FROM Person
where CREATEDDATE = (select MAX(CREATEDDATE) from Person)
group by NAME
Try this also 也尝试一下
SELECT DISTINCT
R.NAME,
COUNT(1) OVER (PARTITION BY NAME),
MAX(R.CREATEDDATE) OVER (PARTITION BY NAME ) ,
MAX(P.CREATEDTIME) OVER (PARTITION BY NAME )
FROM
Person
One more, no joins or subquery 再执行一次,没有联接或子查询
SELECT NAME, COUNT (ID) AS COUNT
, MaxCREATEDDATE = MAX(cast(CREATEDDATE as bigint)*1000000000 + CREATEDTIME) /1000000000
, CorrespTime = MAX(cast(CREATEDDATE as bigint)*1000000000 + CREATEDTIME) %1000000000
FROM Person
GROUP by NAME
You can calculate count
and max(CREATEDDATE)
in inner query and then join back to your table to get time according to max date for each person: 您可以在内部查询中计算count
和max(CREATEDDATE)
,然后重新连接到表中以根据每个人的最大日期获取时间:
select
R.NAME,
R.COUNT,
R.CREATEDDATE,
P.CREATEDTIME
from
(
SELECT NAME, COUNT (ID) AS COUNT, MAX(CREATEDDATE) as CREATEDDATE
FROM Person
group by NAME
) as R
left outer join Person as P on P.NAME = R.NAME and P.CREATEDDATE = R.CREATEDDATE
select * from
(
SELECT *,
COUNT(1) OVER (PARTITION BY NAME) as count,
row_number() OVER (PARTITION BY NAME order by CREATEDDATE desc) as rn
FROM Person
) tt
where tt.rn = 1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.