选择仅限于最近日期的行

时间:2016-05-24 00:48:15

标签: sql

我是一个SQL新手,试图找出一种减少行的方法,基本上每行只给我一个名字,标准是最新的" Encounter Date"。我想离开这个:

    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查询类型的任何想法来实现这一点?谢谢!

3 个答案:

答案 0 :(得分:1)

如果您正在使用SQL Server或任何其他支持窗口功能的dbms,您可以使用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

答案 1 :(得分: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]

应该有用。

答案 2 :(得分:0)

您可以使用ROW_NUMBER()函数按“遇到日期”列对每一行进行排名,该列位于基于名称列的组中。

OVER()子句按名称列对表进行分区,并按照遭遇日期对每个分区内的行进行排序。

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