根据DateTime字段选择最新结果

时间:2014-04-10 10:12:26

标签: sql sql-server-2008

我有一个只有4个字段的简单表。

http://sqlfiddle.com/#!3/06d7d/1

CREATE TABLE Assessment (
  id INTEGER IDENTITY(1,1) PRIMARY KEY,
  personId INTEGER NOT NULL,
  dateTaken DATETIME,
  outcomeLevel VARCHAR(2)
)

INSERT INTO Assessment (personId, dateTaken, outcomeLevel)
VALUES (1, '2014-04-01', 'L1')

INSERT INTO Assessment (personId, dateTaken, outcomeLevel)
VALUES (1, '2014-04-05', 'L2')

INSERT INTO Assessment (personId, dateTaken, outcomeLevel)
VALUES (2, '2014-04-03', 'E3')

INSERT INTO Assessment (personId, dateTaken, outcomeLevel)
VALUES (2, '2014-04-07', 'L1')

我正在尝试根据dateTaken选择每个“personId”他们的最新评估结果。

所以我希望输出以下数据。

[personId, outcomeLevel]
[1, L2]
[2, L1]

谢谢, 丹尼

6 个答案:

答案 0 :(得分:2)

试试这个:

;with cte as
(select personId pid, max(dateTaken) maxdate
 from assessment
 group by personId)

select personId, outcomeLevel
from assessment a
inner join cte c on a.personId = c.pid
where c.maxdate = a.dateTaken
order by a.personId

答案 1 :(得分:1)

以下是使用公用表表达式的可能解决方案:

WITH cte AS (
SELECT
    ROW_NUMBER() OVER (PARTITION BY personId ORDER BY dateTaken DESC) AS rn
    , personId
    , outcomeLevel
FROM
    [dbo].[Assessment]
)
SELECT
    personId
    , outcomeLevel
FROM
    cte
WHERE
    rn = 1

关于CTE

  

公用表表达式(CTE)可以被认为是在单个SELECT,INSERT,UPDATE,DELETE或CREATE VIEW语句的执行范围内定义的临时结果集。 CTE类似于派生表,因为它不作为对象存储,并且仅在查询期间持续。与派生表不同,CTE可以是自引用的,并且可以在同一查询中多次引用。 From MSDN: Using Common Table Expressions

答案 2 :(得分:1)

;with Cte as (Select personId,outcomeLevel, C= ROW_NUMBER()
            over(PARTITION By personId Order By dateTaken desc)
            From #Assessment
            )

Select * from cte where C=1

示例here

答案 3 :(得分:1)

SELECT asst.personId,
       asst.outcomeLevel 
FROM dbo.Assessment asst
WHERE  asst.dateTaken=(SELECT MAX(ast.dateTaken) 
                       FROM assessment ast
                       WHERE asst.personid=ast.personId)
ORDER BY asst.personId

结果将是这样的

personId outcomeLevel 1 L2 2 L1

答案 4 :(得分:0)

试试这个:

SELECT a.personId, a.outcomeLevel
FROM Assessment a
INNER JOIN 
  (
    SELECT max(dateTaken) as datetaken1, personId 
    FROM Assessment
    GROUP BY personId ) b 
ON a.dateTaken = b.datetaken1

演示:http://sqlfiddle.com/#!3/06d7d/9

想法是首先派生一个包含每人最多日期的表格,然后将其与日期字段中的原始表格连接起来,这样您就可以得到这个最大日期的结果等级......

答案 5 :(得分:0)

如果没有cte,这应该可以正常工作:

SELECT [Table4].[personId], [Table4].[outcomeLevel]
FROM (
    SELECT [Table1].[personId]
    FROM [Assessment] AS [Table1]
    GROUP BY [Table1].[personId]
    ) AS [Table2]
CROSS APPLY (
    SELECT TOP (1) [Table3].[personId], [Table3].[outcomeLevel], [Table3].[dateTaken]
    FROM [Assessment] AS [Table3]
    WHERE [Table2].[personId] = [Table3].[personId]
    ORDER BY [Table3].[dateTaken] DESC
    ) AS [Table4]
ORDER BY [Table4].[dateTaken] DESC