从 SQL Server 数据库中获取最后一个值的列表并左连接到视图
Posted
技术标签:
【中文标题】从 SQL Server 数据库中获取最后一个值的列表并左连接到视图【英文标题】:Fetching the list of last values from SQL Server database and left join to a view 【发布时间】:2014-10-08 16:00:58 【问题描述】:有没有办法从数据库中获取最后一个值的列表?我有一个名为 SessionList
的表,其中列有 StudId
(SID
)、Therapist ID
(TID
)、Date
我共有 5 个孩子,SID
1,2,3,4,5 和 10 名 TID 1,2,3 的治疗师...
现在所有的孩子都被分配给一个特定的治疗师。
因此,孩子 1 被分配给治疗师 10,2 被分配给治疗师 5,依此类推,他们开始教他们的日期。我可以从某个日期开始为孩子更换治疗师,例如治疗师在 1 月和 2 月与孩子 1 在一起,现在他从 3 月开始被重新分配到治疗师 7。所以我有一份所有这些记录的清单。因此,一个孩子的表中可以有多个记录,而该孩子的最后一条记录将是该孩子的当前治疗师。
如何从表中获取所有孩子的最后记录列表。如果我在 DB 中总共有 12 条记录,我的查询应该只获取 5 条记录,这些记录代表该孩子在数据库中的最后一个条目。
我厌倦了使用 LAST 关键字。在同一张表上使用连接。没用。
有什么方法可以创建视图并使用内/左连接来解决这个问题?
【问题讨论】:
【参考方案1】:如果您使用的是 SQL Server 2005 及更高版本(您在这方面不够具体),则一种方法是使用 CTE(通用表表达式)。
使用此 CTE,您可以按某些标准(即您的 CustomerId
)对数据进行分区,并让 SQL Server 为每个“分区”从 1 开始为您的所有行编号,并按某些标准排序。
所以试试这样的:
CREATE VIEW vw_CurrentTherapists
AS
WITH CurrentTherapist AS
(
SELECT
SID, TID, [Date],
RowNum = ROW_NUMBER() OVER(PARTITION BY SID ORDER BY Date DESC)
FROM
dbo.SessionList
)
SELECT
SID, TID, [Date]
FROM
CurrentTherapist
WHERE
RowNum = 1
在这里,我只为每个“分区”(即每个 SID
- 每个孩子)选择“第一个”条目 - 按日期排序。
这是否符合您的要求??
PS:使用像 Date
这样的列名非常糟糕 - 首先,这并不能告诉我根本它是什么类型的日期 - 此外,从 SQL Server 开始2008,DATE
是保留关键字(用于数据类型)。尝试使您的列名更具表现力、更有意义,并避免使用所有 SQL Server 保留关键字! (见official MSDN documentation on the reserved keywords in SQL Server)
我建议使用类似SessionDate
(如果这意味着会话发生的日期)或ValidFrom
如果它表示孩子/治疗师匹配实际有效/到位的日期.
【讨论】:
是否可以像RowNum = ROW_NUMBER() OVER(PARTITION BY SID ORDER BY Date DESC)
一样在SELECT
中定义一列?我明天上班的时候去看看。以为只能像ROW_NUMBER() OVER(PARTITION BY SID ORDER BY Date DESC) AS RowNum
那样做。抱歉,如果这听起来像我在吹毛求疵...
@TT.:如果您希望能够仅选择每个分区的第一行 (WHERE RowNum = 1
),则必须使用某种子查询或CTE - 不能直接做。
这就是我想要的。但是不是获取第一行,是否可以获取具有 MAX RowNum 值的行?在某些情况下,孩子 1 有 3 条记录,而孩子 4 只有一条记录。
@arpanshah:只需“翻转”ORDER BY
子句 - 按 [Date] ASC
排序,然后选择第一个 RowNum
哦,是的,有道理。我现在觉得自己很愚蠢。:P 非常感谢。以上是关于从 SQL Server 数据库中获取最后一个值的列表并左连接到视图的主要内容,如果未能解决你的问题,请参考以下文章
从查询 SQL Server 中的每个日期获取第一个和最后一个日期时间