我正在使用Sql server 2008.i有一个包含以下列的表,
Id,
Name,
Date
这个表包含多个相同id.i的记录想要得到具有最大date的独立id。我可以为此编写sql查询吗?
答案 0 :(得分:8)
使用ROW _ NUMBER() function和PARTITION BY子句。像这样:
SELECT Id, Name, Date FROM (
SELECT *, ROW_NUMBER() OVER (PARTITION BY Id ORDER BY Date desc) AS ROWNUM
FROM [MyTable]
) x WHERE ROWNUM = 1
答案 1 :(得分:2)
如果您只需要ID
列,则不需要其他列,那么您无需使用ROW_NUMBER
或MAX
或其他任何内容。您只需Group By
列ID
列,因为无论最大日期是什么,您都会获得相同的ID。
SELECT ID FROM table GROUP BY ID
--OR
SELECT DISTINCT ID FROM table
如果您需要具有最长日期的ID
和Date
列,则只需在Group By
列上执行ID
并选择Max
日期。
SELECT ID, Max(Date) AS Date
FROM table
GROUP BY ID
如果你需要所有的列,但是1行有Max。如果是日期,您可以按照其他答案中提到的ROW_NUMBER
或MAX
进行操作。
SELECT *
FROM table AS M
WHERE Exists(
SELECT 1
FROM table
WHERE ID = M.ID
HAVING M.Date = Max(Date)
)
答案 2 :(得分:1)
单向,使用ROW_NUMBER
:
With CTE As
(
SELECT Id, Name, Date, Rn = Row_Number() Over (Partition By Id
Order By Date DESC)
FROM dbo.TableName
)
SELECT Id --, Name, Date
FROM CTE
WHERE Rn = 1
如果可能有多个最大日期,而您希望所有内容都可以使用DENSE_RANK
。
这里概述了sql-server的排名功能:http://technet.microsoft.com/en-us/library/ms189798.aspx
顺便说一下,CTE
是common-table-expression,类似于命名的子查询。我使用它可以按row_number
进行过滤。如果需要,此方法允许选择所有列。
答案 3 :(得分:1)
选择“最大日期”作为“最大日期” 从表 按ID分组 按ID
排序
答案 4 :(得分:0)
尝试使用Max(Date)
和GROUP BY
其他两列(具有重复数据的列)。
SELECT ID, Max(Date) as date, Name
FROM YourTable
GROUP BY ID, Name
答案 5 :(得分:0)
您可以尝试使用此
DECLARE @T TABLE(ID INT, NAME VARCHAR(50),DATE DATETIME)
INSERT INTO @T VALUES(1,'A','2014-04-20'),(1,'A','2014-04-28')
,(2,'A2','2014-04-22'),(2,'A2','2014-04-24')
,(3,'A3','2014-04-20'),(3,'A3','2014-04-28')
,(4,'A4','2014-04-28'),(4,'A4','2014-04-28')
,(5,'A5','2014-04-28'),(5,'A5','2014-04-28')
SELECT T.ID FROM @T T
WHERE T.DATE=(SELECT MAX(A.DATE)
FROM @T A
WHERE A.ID=T.ID
GROUP BY A.ID )
GROUP BY T.ID
答案 6 :(得分:0)
select id, max(date) from NameOfYourTable group by id;