简体   繁体   English

选择对应于MAX列值的列值

[英]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: 您可以在内部查询中计算countmax(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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM