2016-05-24 178 views
0

我是一名SQL新手,试图找出一种削减行的方法,该行基本上只给我每行一个名称,条件是最新的“遭遇日期”。我想从这个去:选择限于最近日期的行

Measure_ID Name User Encounter Date Numerator 
    NQF-0101  A  1   4/10/2015  0 
    NQF-0101  A  1   4/11/2015  1 
    NQF-0101  B  2   4/12/2015  1 
    NQF-0101  B  2   4/13/2015  0 
    NQF-0101  C  3   4/14/2015  1 
    NQF-0101  C  3   4/15/2015  1 
    NQF-0101  C  3   4/16/2015  1 

要这样:

Measure_ID Name User Encounter Date Numerator 
    NQF-0101  A  1   4/11/2015   1 
    NQF-0101  B  2   4/13/2015   0 
    NQF-0101  C  3   4/16/2015   1 

对SQL查询的类型有什么想法,我可以运行来实现这一目标?谢谢!

+1

您使用的是什么dbms? –

+0

SELECT * FROM table_name GROUP BY名称ORDER BY encounter_date? – Alfie

+0

我实际上在Tableau中使用自定义SQL;我不确定它是否与其他dbms类似。 – Josh

回答

0

假设UserEncounter Date是唯一的,那么

Select t.* 
from MyTable t 
join (select User, max([Encounter Date]) as [Encounter Date] 
     from MyTable 
     group by User) q 
on q.User= t.User and q.[Encounter Date] = t.[Encounter Date] 

应该工作。

1

如果您使用的SQL Server,或支持窗口功能的任何其它数据库管理系统,你可以使用ROW_NUMBER

WITH CTE AS(
    SELECT *, 
     rn = ROW_NUMBER() OVER(PARTITION BY Measure_ID, User ORDER BY EncounterDate DESC) 
    FROM tbl 
) 
SELECT * 
FROM CTE 
WHERE rn = 1 

如果没有,你可以使用MAX功能:

SELECT t1.* 
FROM tbl t1 
INNER JOIN (
    SELECT 
     Measure_ID, User, MAX(EncounterDate) AS MaxDate 
    FROM tbl 
    GROUP BY Measure_ID, User 
) t2 
    ON t1.Measure_ID = t2.Measure_ID 
    AND t1.User = t2.User 
    AND t1.EncouterDate = t2.MaxDate 
0

您可以使用ROW_NUMBER()函数按照Encounter Date列在基于名称列的组内对每行进行排名。

OVER()子句按名称列对表进行分区,并按每个分区的Encounter Date对各个分区中的行进行排序。

SELECT 
    measure_id 
    ,name 
    ,[user] 
    ,encounter_date 
    ,numerator 
FROM(
    SELECT 
    measure_id 
    ,name 
    ,[user] 
    ,encounter_date 
    ,numerator 
    ,ROW_NUMBER() OVER(PARTITION BY name ORDER BY encounter_date DESC) AS row_num 
    FROM test 
)q 
WHERE row_num = 1 

使用子查询可以过滤除最近行以外的所有内容。

以下是在sqlfiddle中工作的示例:http://sqlfiddle.com/#!6/ba10b/2