2017-09-13 96 views
2

得到最新值我已经PROJECT_ID INT,UPDATE_DATE日期时间,UPDATE_TEXT VARCHAR(最大值)SQL Server将日期

表有每PROJECT_ID许多更新SQL Server表。我需要通过update_date为所有的project_id值获取最新的。

例子:

 
project_id update_date update_text 
1    2017/01/01  Happy new year. 
2    2017/01/01  Nice update 
2    2017/02/14  Happy Valentine's 
3    2016/12/25  Merry Christmas 
3    2017/01/01  A New year is a good thing 

查询应得到:

 
project_id update_date update_text 
1    2017/01/01  Happy new year. 
2    2017/02/14  Happy Valentine's 
3    2017/01/01  A New year is a good thing 

回答

4

使用top with tiesrow_number()

select top 1 with ties 
    project_id, update_date, update_text 
from projects 
order by row_number() over (partition by project_id order by update_date desc) 

rextester演示:http://rextester.com/MGUNU86353

回报:

+------------+-------------+----------------------------+ 
| project_id | update_date |  update_text   | 
+------------+-------------+----------------------------+ 
|   1 | 2017-01-01 | Happy new year.   | 
|   2 | 2017-02-14 | Happy Valentine's   | 
|   3 | 2017-01-01 | A New year is a good thing | 
+------------+-------------+----------------------------+ 
+0

打我吧!这是正确的答案。通过project_id进行分区和按日期排序desc是回答这种多重身份验证/审核类型数据的最佳方法。 – Simon

0

你可以做到这一点是:

with CTE as(
SELECT project_id, MAX(update_date) update_date 
FROM YourTable 
GROUP BY project_id 
    ) 

SELECT cte.project_id, cte.update_date , max(t.update_text) update_text 
FROM YourTable T inner join CTE on T.project_id = CTE.project_id 
group by cte.project_id, cte.update_date ; 

Demo

+0

这将会给你一个错误,你有'MAX(UPDATE_DATE)'和' GROUP BY project_id'但是'update_text'缺少聚合。 – Simon

+0

@Simon是的,我会修复答谢谢你。 – Sami

+0

@Simon现在完成了! – Sami

1

该查询会给你为每个项目

Select Project_Id, Max (Update_Date) Max_Update_Date 
From MyTable 
Group By Project_Id 

因此,加入回原始表的最后日期

Select Project_Id, Update_Date, Update_Text 
From MyTable 
Inner Join 
(
    Select Project_Id, Max (Update_Date) Max_Update_Date 
    From MyTable 
    Group By Project_Id 
) MaxDates 
On MyTable.Project_Id = MaxDates.Project_Id 
And MyTable.Update_Date = MaxDates.Max_Update_Date 
1

您可以找到MAX(date)这样的:

SELECT * FROM [table] 
INNER JOIN (SELECT project_id, date = MAX(update_date) FROM [table] GROUP BY project_id) AS a 
ON [table].project_id = a.project_id AND update_date = date 

或者您可以使用ROW_NUMBER()如:

SELECT * FROM (
SELECT *, rownum = ROW_NUMBER() OVER (PARTITION BY project_id ORDER BY 
update_date DESC) FROM [table] 
) AS a WHERE rownum = 1