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