2015-09-08 31 views
-1
a = id 
b = date 
c = NewestDate 

对于每一个,我有B C最近(最大)日期为每个ID

我怎样才能得到每一组ID的(我的“一”列)的最新日期?他们并不都具有相同的结束日期。所以我确实需要所有人的最大值。

的数据是在myTable的, 到目前为止,我尝试:

select * 
into #myTable 
from myTable 

select 
t.a 
,t.b 
,t.c 
,(select max(b) from myTable) as c 
from myTable t 
left join #myTable t1 
on t.a = t1.a and t.b = t1.b 
order by a, b 

与上面的代码的问题是,在“C”是把他们所有的最大日期,这是不是我其实想要。

编辑:现在的问题已解决与德米特里波利亚科夫给出的答案(谢谢)。使用:

SELECT a, 
    b, 
    max(b) OVER (PARTITION BY a) AS c 
FROM myTable 
ORDER BY a,b 
+2

窗口函数是您的朋友。 – lad2025

+0

你是什么意思?对不起,没有经历过这 –

+3

https://msdn.microsoft.com/en-us/library/ms189461.aspx – user996142

回答

2

您可以选择每个组ID的最大日期

SELECT a, 
    b, 
    max(b) OVER (PARTITION BY a) AS c 
FROM myTable 
ORDER BY a,b 

编辑:对于问题的第二(编辑)的部分可能的解决方案一个是

WITH cte AS (
    SELECT a, 
     b, 
     max(b) OVER (PARTITION BY a) AS c, 
     d 
    FROM myTable 
) 
SELECT t1.a, 
    t1.b, 
    t1.c, 
    t1.d, 
    t2.d AS e 
FROM cte t1 
JOIN cte t2 ON t1.a=t2.a AND t1.c=t2.b 
+0

这解决了我的问题。奇迹般有效。谢谢 –

1
DECLARE @updates TABLE (a int,b date,c date) 
INSERT INTO @updates VALUES 
    (1,GETDATE(),GETDATE()+10), 
    (2,GETDATE()+11,GETDATE()+13), 
    (2,GETDATE()+11,GETDATE()+14), 
    (3,GETDATE()+11,GETDATE()+13), 
    (1,GETDATE()+11,GETDATE()+13); 

WITH 
    cte AS 
    (
    SELECT a, max(c) latest 
    FROM @updates 
    GROUP BY a 
) 

SELECT * 
FROM cte INNER JOIN @updates as d ON cte.a=d.a AND cte.latest = d.c 

建立一个表来选择记录与最新的更新和n将这个新表与您的原始表连接以提取匹配行中的所有字段