Sql 选择“最大列值”对应的列值
我有一个人,日期是Sql 选择“最大列值”对应的列值,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个人,日期是yyyymmDD格式,时间是hhmmssss格式 ID NAME CREATEDDATE CREATEDTIME 1 A 20170205 135744300 2 B 20160205 113514368 3 C 20090205 163054942 4 A 20150205 135744301
yyyymmDD
格式,时间是hhmmssss
格式
ID NAME CREATEDDATE CREATEDTIME
1 A 20170205 135744300
2 B 20160205 113514368
3 C 20090205 163054942
4 A 20150205 135744301
现在我想在单个查询中获得每个人的计数、最大createddate和相应的createdTIME
我试过了
SELECT NAME, COUNT (ID) AS COUNT, MAX(CREATEDDATE), MAX(CREATEDTIME)
FROM Person
但这给了我每个列的最长日期和最长时间,它没有给我对应于MAX(CREATEDDATE)的CREATEDTIME
e、 g
查询结果为
NAME COUNT MAXCREATEDDATE CORRESPONDINGCREATEDTIME
A 2 20170205 135744301
对应的CreatedTime
应该是135744300
请帮我做这件事您可以在内部查询中计算
计数
和最大值(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
您只需使用一个子查询即可做到这一点,该子查询查找每个名称的最大日期并执行内部联接 测试数据
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)
质疑
结果
Name CountName CreatedDate CreatedTime
A 2 20170205 135744300
B 1 20160205 113514368
C 1 20090205 163054942
试试这个答案
SELECT NAME, COUNT(ID) AS COUNT, max(CREATEDDATE), max(CREATEDTIME)
FROM Person
where CREATEDDATE = (select MAX(CREATEDDATE) from Person)
group by NAME
也试试这个
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
还有一个,没有联接或子查询
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
最后两列是什么数据类型?日期/时间或varchar或int?它们是int。日期和时间是保留格式。这不是OP想要的结果。您的查询将只输出一个创建日期等于所有记录的最大创建日期的人。是的,没错,我希望每个人的最大日期和对应日期time@DineshDB我想,但他的结果确实给出了OP发布的预期结果的例子。我认为现在betterIt仍然是最长时间。OP说的确实是个问题。看我的答案。哇,真是个天才!你能解释一下逻辑吗?我想你已经把这两个都加上了,然后把日期和时间都加上了。第一个CREATEDDATE和CREATEDTIME被包装成单个bigint。当找到max时,将应用整数分割(
/
%
)来取回零件。
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
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