我是一个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查询类型的任何想法来实现这一点?谢谢!
答案 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)
假设User
和Encounter 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