Sql 选择基于日期时间字段的最新结果

Sql 选择基于日期时间字段的最新结果,sql,sql-server-2008,Sql,Sql Server 2008,我有一个只有4个字段的简单表 我正试图为每个“personId”选择基于日期的最新评估结果 因此,我希望以下数据的输出是 [personId, outcomeLevel] [1, L2] [2, L1] 谢谢, 丹尼试试这个: ;with cte as (select personId pid, max(dateTaken) maxdate from assessment group by personId) select personId, outcomeLevel from ass

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

我正试图为每个“personId”选择基于日期的最新评估结果

因此,我希望以下数据的输出是

[personId, outcomeLevel]
[1, L2]
[2, L1]
谢谢, 丹尼

试试这个:

;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
试试这个:

;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
试试这个:

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
演示:

想法是首先导出一个具有每个人的最大日期的表,然后将其与日期字段上的原始表连接,这样您就可以获得此最大日期的结果级别…

尝试以下方法:

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
演示:


想法是首先导出一个具有每人最大日期的表,然后将其与日期字段上的原始表连接,以便您可以获得此最大日期的结果级别…

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

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可以自引用,并且可以在同一查询中多次引用


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

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可以自引用,并且可以在同一查询中多次引用

样品


示例

这在没有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

在没有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
结果将是这样的

人格结果水平 1 L2 2 L1

结果将是这样的

人格结果水平 1 L2
2 L1

我可以问一下;一开始是为了什么?只是为了确保它在之前终止任何东西?基本上是为了用脚本中的来划分它属于哪个
。你可以参考这篇文章来获得一个很好的解释:。也可以终止,因为分号用于此目的。您不能在另一个查询的左连接中使用它吗?关键字“WITH”附近的语法不正确。这取决于您是如何编写的。CTE作用域仅限于定义查询后立即使用的查询。我刚刚尝试在ASS.personId=P.personidc上包装一个左连接(您的答案)ASS,我可以问:;一开始是为了什么?只是为了确保它在之前终止任何东西?基本上是为了用脚本中的
来划分它属于哪个
。你可以参考这篇文章来获得一个很好的解释:。也可以终止,因为分号用于此目的。您不能在另一个查询的左连接中使用它吗?关键字“WITH”附近的语法不正确。这取决于您是如何编写的。CTE作用域仅限于定义查询后立即使用的查询。我刚刚尝试在ASS.personId=P.personId上包装一个左连接(您的答案)ASS