Sql 选择基于日期时间字段的最新结果
我有一个只有4个字段的简单表 我正试图为每个“personId”选择基于日期的最新评估结果 因此,我希望以下数据的输出是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
[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