Sql 如何查询每个重复名称的最新日期

Sql 如何查询每个重复名称的最新日期,sql,oracle,Sql,Oracle,我有一个问题要查询具有每个名称的最新日期的元组 这是我的示例表 ID || NAM E || DATE || INFOA || INFOB || INFOC 1 || Alice || 2015-08-20 12:0:0 || Y || N || Y 2 || Bob || 2015-08-20 12:0:0 || Y || N || Y 3 || Cheschire || 2015-08-20 12:0

我有一个问题要查询具有每个名称的最新日期的元组

这是我的示例表

ID || NAM E     || DATE              || INFOA || INFOB || INFOC
1  || Alice     || 2015-08-20 12:0:0 || Y     || N     || Y
2  || Bob       || 2015-08-20 12:0:0 || Y     || N     || Y
3  || Cheschire || 2015-08-20 12:0:0 || N     || Y     || Y
4  || Alice     || 2015-08-25 12:0:0 || N     || Y     || N
5  || Bob       || 2015-08-15 12:0:0 || Y     || Y     || N
我使用的查询

SELECT NAME, MAX(DATE), INFOA, INFOB, INFOC
FROM EXAMPLE_TABLE
GROUP BY NAME,INFOA,INFOB,INFOC 
结果是

Alice     || 2015-08-20 12:0:0 || Y || N || Y
Bob       || 2015-08-20 12:0:0 || Y || N || Y
Cheschire || 2015-08-20 12:0:0 || N || Y || Y
Alice     || 2015-08-25 12:0:0 || N || Y || N
Bob       || 2015-08-15 12:0:0 || Y || Y || N
Bob       || 2015-08-20 12:0:0 || Y || N || Y
Cheschire || 2015-08-20 12:0:0 || N || Y || Y
Alice     || 2015-08-25 12:0:0 || N || Y || N
但我的预期结果是

Alice     || 2015-08-20 12:0:0 || Y || N || Y
Bob       || 2015-08-20 12:0:0 || Y || N || Y
Cheschire || 2015-08-20 12:0:0 || N || Y || Y
Alice     || 2015-08-25 12:0:0 || N || Y || N
Bob       || 2015-08-15 12:0:0 || Y || Y || N
Bob       || 2015-08-20 12:0:0 || Y || N || Y
Cheschire || 2015-08-20 12:0:0 || N || Y || Y
Alice     || 2015-08-25 12:0:0 || N || Y || N

我该怎么办?

请尝试使用下面的代码片段

DECLARE @userData TABLE(
    ID INT NOT NULL,
    Name VARCHAR(MAX) NOT NULL,
    [Date] DATETIME NOT NULL,
    INFOA VARCHAR(MAX) NOT NULL,
    INFOB VARCHAR(MAX) NOT NULL,
    INFOC VARCHAR(MAX) NOT NULL
);

INSERT INTO @userData VALUES ('1','Alice','2015-08-20 12:0:0','Y','N','Y')
INSERT INTO @userData VALUES ('2','Bob','2015-08-20 12:0:0','Y','N','Y')
INSERT INTO @userData VALUES ('3','Cheschire','2015-08-20 12:0:0','N','Y','Y')
INSERT INTO @userData VALUES ('4','Alice','2015-08-25 12:0:0','N','Y','N')
INSERT INTO @userData VALUES ('5','Bob','2015-08-15 12:0:0','Y','Y','N')

SELECT a.ID,a.Name,a.Date, a.INFOA,a.INFOB,a.INFOC FROM (
select *,RANK() OVER (PARTITION BY [Name] ORDER BY [DATE] DESC) AS [Rank]
 from @userData
 ) a  where a.[Rank] = 1
ORDER BY a.ID

如果没有其他行具有相同的名称但日期较晚,请使用
NOT EXISTS
返回一行:

select *
from tablename t1
where NOT EXISTS (select 1 from tablename t2
                  where t2.name = t1.name
                    and t2.date > t1.date)
我尝试了以下方法:

CREATE TABLE T1(AA varchar2(10),bb TIMESTAMP(6),cc varchar2(1),dd varchar2(1),ee varchar2(1));

INSERT INTO T1 VALUES ('a',systimestamp-5,'Y','N','Y');
INSERT INTO T1 VALUES ('b',systimestamp-5,'N','N','Y');
INSERT INTO T1 VALUES ('c',systimestamp-5,'N','Y','Y');
INSERT INTO T1 VALUES ('a',systimestamp-1,'N','Y','N');
insert into t1 values ('b',systimestamp-11,'Y','Y','N');
现在,下面是我用来获取您想要的输出的查询:

SELECT * FROM T1
WHERE (t1.aa, T1.BB) IN (SELECT aa, MAX(BB)
                         from t1 group by aa);
输出:

b   21-AUG-15 02.51.47.000000000 AM N   N   Y
c   21-AUG-15 02.51.47.000000000 AM N   Y   Y
a   25-AUG-15 02.51.48.000000000 AM N   Y   N

注意:根据您的问题,您需要每个名称的最新日期(无论其他值是什么)

使用下面的查询以获得预期的结果

select id,name,date1,infoa,infob,infoc
    from 
    (
    select id,name,date1, row_number() over (partition by name order by date1 desc) as s
    ,infoa,infob,infoc
    from testpart
    )
    where s=1
    order by date1

您可以指定您使用的sql,如mysql、sqlServer吗