2013-09-16 33 views
0

示例代码:查询具有最大的日期的一组多个记录....几分

DECLARE @TABLE TABLE (ID int, Name varchar(50), Date Datetime2) 

INSERT INTO @TABLE (ID, Name, Date) 
SELECT 1, 'abc', GETDATE() 
UNION ALL 
SELECT 1, 'def', GETDATE() 
UNION ALL 
SELECT 1, 'hij', GETDATE() 
UNION ALL 
SELECT 1, 'abc', GETDATE()-2 
UNION ALL 
SELECT 1, 'def', GETDATE()-2 
UNION ALL 
SELECT 1, 'hij', GETDATE()-2 
UNION ALL 
SELECT 1, 'abc', GETDATE()-4 
UNION ALL 
SELECT 1, 'def', GETDATE()-4 
UNION ALL 
SELECT 1, 'hij', GETDATE()-4 
UNION ALL 
SELECT 2, 'abc', GETDATE()-1 
UNION ALL 
SELECT 2, 'def', GETDATE()-1 
UNION ALL 
SELECT 2, 'hij', GETDATE()-1 
UNION ALL 
SELECT 2, 'abc', GETDATE()-3 
UNION ALL 
SELECT 2, 'def', GETDATE()-3 
UNION ALL 
SELECT 2, 'hij', GETDATE()-3 
UNION ALL 
SELECT 2, 'abc', GETDATE()-4 
UNION ALL 
SELECT 2, 'def', GETDATE()-4 
UNION ALL 
SELECT 2, 'hij', GETDATE()-4 
UNION ALL 
SELECT 3, 'abc', GETDATE()+2 
UNION ALL 
SELECT 3, 'def', GETDATE()+2 
UNION ALL 
SELECT 3, 'hij', GETDATE()+2 
UNION ALL 
SELECT 3, 'abc', GETDATE()-4 
UNION ALL 
SELECT 3, 'def', GETDATE()-4 
UNION ALL 
SELECT 3, 'hij', GETDATE()-4 
UNION ALL 
SELECT 3, 'abc', GETDATE()-5 
UNION ALL 
SELECT 3, 'def', GETDATE()-5 
UNION ALL 
SELECT 3, 'hij', GETDATE()-5 
UNION ALL 
SELECT 4, 'abc', GETDATE()+1 
UNION ALL 
SELECT 4, 'def', GETDATE()+1 
UNION ALL 
SELECT 4, 'hij', GETDATE()+1 
UNION ALL 
SELECT 4, 'abc', GETDATE()-4 
UNION ALL 
SELECT 4, 'def', GETDATE()-4 
UNION ALL 
SELECT 4, 'hij', GETDATE()-4 
UNION ALL 
SELECT 4, 'abc', GETDATE()-5 
UNION ALL 
SELECT 4, 'def', GETDATE()-5 
UNION ALL 
SELECT 4, 'hij', GETDATE()-5 

SELECT * FROM @TABLE 

数据输出,我想反映以下记录

3 abc 2013-09-18 
3 def 2013-09-18 
3 hij 2013-09-18 

描述输出:我想要查询最近处理过的ID /名称的数据(最大(日期))(如果它们在相同的日期/时间处理,可以有多个ID)

我的尝试...

SELECT DISTINCT A.*, B.My_Rank 
FROM @TABLE A 
     INNER JOIN 
     (
      SELECT DISTINCT ID, Name, CONVERT(varchar(8), Date, 101) AS Date, RANK() OVER (PARTITION BY ID, Name ORDER BY CONVERT(varchar(8), Date, 101) DESC) My_Rank, MAX(CONVERT(varchar(8), Date, 101)) OVER (partition by ID, Name) Max_Date 
      FROM @TABLE 
      GROUP BY ID, Name, CONVERT(varchar(8), Date, 101) 
     ) B 
ON A.ID = B.ID AND CONVERT(varchar(8), A.Date, 101) = B.Max_Date 
WHERE My_Rank = 1 

显然,这种逻辑是不工作的。 “我想根据最新的处理ID /名称以获取ID /姓名/日期记录

谢谢

回答

3

你接近,但你没有加入背部(你可能不希望PARTITION BY ID:

SELECT * 
FROM 
(
    SELECT ID, Name, Date, 
     RANK() OVER (ORDER BY CAST(Date AS DATE) DESC) My_Rank 
    FROM @TABLE 
) dt 
WHERE My_rank = 1  

AFAIK SS2008支持CAST(x AS DATE)

+0

万岁!谢谢dnoeth让我免于过度复杂的事情(更新了我在OP中的查询)... :) – 007

1

您想使用max()partition by条款:

SELECT * 
FROM (select a.*, 
      max("date") over (partition by id) as maxdate 
     from @TABLE A 
    ) a 
where "date" = maxdate; 

这可以返回多行如果你只有一个人,甚至当有关系,然后使用row_number()

SELECT * 
FROM (select a.*, 
      row_number() over (partition by id order by "date" desc) as seqnum 
     from @TABLE A 
    ) a 
where seqnum = 1; 
+0

感谢戈登,我想你贴什么,但它没有工作,因为我想。我改变了我的期望输出仅仅通过之日起,忘了时间,ABC,DEF,HIJ会对同一日期不同的时间。更新了我的预期输出部分的OP。 – 007

相关问题