从 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 中的每个日期获取第一个和最后一个日期时间

SQL Server - 重叠数据的累积总和 - 获取总和达到给定值的日期

如何获取所有 SQL Server 默认值和规则的名称

SQL:查询以获取特定列的值的最后更改

Sql Server - 仅为活动用户获取值的 SUM()

如何使用 ODBC 在 SQL Server 2000 中获取最后插入的 id?