【问题标题】:SQL Server 2012 Max Date in Subquery in a joined table联接表中子查询中的 SQL Server 2012 最大日期
【发布时间】:2016-05-06 19:39:04
【问题描述】:

我管理一个州级应用程序并使用Tableau 来创建数据的可视化。

我的任务是创建一个可视化,显示从联系人条目到今天(案例注释日期)之间经过了多少时间。我知道如何在案例注释表中隔离最大案例注释日期:

Select 
    [Case_Master_ID],
    [Case_Note_Date],
    [Case_Note_Category_Desc],
    [Case_Note_Summary_Narr]
From 
    buCase_Note 
Where 
    Case_Note_Date = (Select MAX(Case_Note_Date)
                      From buCase_Note)

此查询将显示从今天起表格中的最大案例说明。问题是我需要为所有参与者展示最大案例说明,而不仅仅是今天的参与者。我用来查看案例注释的原始查询是:

Select
    vc.[_Case Master ID],
    vc.[_Caseload Assignment Current],
    vc.[_Participant Name],
    vc.[Case Status],
    vc.[Reporting Structure Level 4],
    vc.[Reporting Structure Level 5],
    vc.[Application Date],
    vc.[Eligibility Date],
    vc.[Eligibility Determination Extension Date],
    vc.[Eligibility Extended To Date], 
    vc.[Days in Application],
    cn.[Case_Note_Date], 
    cn.[Case_Note_Category_Desc],
    cn.[Case_Note_Summary_Narr]
From  
    biVR_Cases vc
Left outer Join 
    buCase_Note cn ON cn.Case_Master_ID = vc.[_Case Master ID]

我需要在左侧保留biVR_Cases 以显示所有打开的客户端。然后我需要加入案例记录表,对于每个参与者,我想显示他们的最大案例记录日期。当我将此添加到上述查询的末尾时:

Where cn.[Case_Note_Date] = (
    Select
        MAX(cn.Case_Note_Date)
    From buCase_Note)

我得到以下错误是 SSMS 2012:

聚合可能不会出现在 WHERE 子句中,除非它出现在 HAVING 子句或选择列表中包含的子查询中,并且被聚合的列是外部引用。

我希望保留左侧的bi 表,同时成功加入案例注释表并仅引入每位参与者最近的案例注释。

添加细节: 当然, 这是我在运行以下查询时获得的数据示例:

Select
 vc.[_Case Master ID],
 vc.[_Caseload Assignment Current],
 vc.[_Participant Name],
cn.[Case_Note_Date],
From  biVR_Cases vc
LEFT outer JOIN buCase_Note cn ON vc.[_Case Master ID] = cn.Case_Master_ID

_Caseload Assignment 当前测试参与者姓名 Casenote Date 考试辅导员参与者 A 2010 年 9 月 29 日 2010 年 9 月 23 日 2010 年 8 月 30 日 2010 年 6 月 30 日 2010 年 6 月 1 日

bi 表包含参与者信息,如姓名、应用程序、案例主 ID 等。casenote 表包含案例主 ID 以及连接。它还包含每个条目的创建日期。所以对于上面的数据集,我试图只为每个参与者带来最新的案例笔记。我在上面的示例中只包括了 1 个,但我们有超过 15,000 个。每个参与者都会有许多案例笔记。我正在尝试获取最上面的案例笔记,这样我就可以计算每个参与者的最新案例笔记与今天之间的日期差异。当我添加:

Where cn.[Case_Note_Date] = (Select
top 1 [Case_Note_Date]
From buCase_Note
Order by 1 DESC))
 OR 
Where Case_Note_Date=(
Select
MAX(Case_Note_Date)
From buCase_Note)

它仅显示今天创建案例笔记的参与者的顶部或最大案例笔记。我不需要在 casenote 表中显示最大 casenote,而是需要每个参与者的最大 casenote。我希望这更有意义。

【问题讨论】:

  • 你应该显示一些数据。您的 MAX(cn.Case_Note_Date) 将仅从 buCase_Note 返回一个数据,而不是每个 [_Case Master ID] 一个数据

标签: sql sql-server-2012 ssms maxdate


【解决方案1】:

您可以尝试我在下面提供的内容。没有实际数据,我不知道它是否对您足够有效,但它应该可以工作。但是,如果您得到更好的答案,我很想知道。

Select vc.[_Case Master ID],
 vc.[_Caseload Assignment Current],
 vc.[_Participant Name],
 vc.[Case Status],
 vc.[Reporting Structure Level 4],
 vc.[Reporting Structure Level 5],
 vc.[Application Date],
 vc.[Eligibility Date],
 vc.[Eligibility Determination Extension Date],
 vc.[Eligibility Extended To Date], 
 vc.[Days in Application],
 cn.[Case_Note_Date], 
 cn.[Case_Note_Category_Desc],
 cn.[Case_Note_Summary_Narr]
From  biVR_Cases vc
LEFT outer JOIN 
   (SELECT Case_Master_ID, Case_Note_Date, Case_Note_Category_Desc, Case_Note_Summar_Narr, 
           ROW_NUMBER() OVER (PARTITION BY Case_Master_ID ORDER BY Case_Note_Date DESC) as RowNum FROM buCase_Note) cn 
   ON cn.Case_Master_ID = vc.[_Case Master ID] AND cn.RowNum=1

【讨论】:

  • 哇,这个效果很好。我很想听听对逻辑的解释,但不想再占用您的时间了。谢谢!
  • 您可以尝试阅读 ROW_NUMBER() 和 OVER 子句。基本思想是,这给每个具有相同 Case_Master_ID 的记录一个编号,按 Case_Note_Date 降序排列。每个 Case_Master_ID 的最近日期的 RowNum 值为 1。我不认为这是最有效的方法,但它确实有效。
【解决方案2】:

MAX(cn.Case_Note_Date) 行中删除cn.。您不想从主查询中引用列。您只想从buCase_Note 中选择一个Case_Note_Date

所以整个查询将是

Select
 vc.[_Case Master ID],
 vc.[_Caseload Assignment Current],
 vc.[_Participant Name],
 vc.[Case Status],
 vc.[Reporting Structure Level 4],
 vc.[Reporting Structure Level 5],
 vc.[Application Date],
 vc.[Eligibility Date],
 vc.[Eligibility Determination Extension Date],
 vc.[Eligibility Extended To Date], 
 vc.[Days in Application],
 cn.[Case_Note_Date], 
 cn.[Case_Note_Category_Desc],
 cn.[Case_Note_Summary_Narr]
From  biVR_Cases vc
LEFT outer JOIN buCase_Note cn ON cn.Case_Master_ID = vc.[_Case Master ID]
Where cn.[Case_Note_Date] = (Select
MAX(Case_Note_Date)
From buCase_Note)

【讨论】:

  • 您好 J.kasper,感谢您的快速回复。建议的调整使查询通过。我仍然遇到和以前一样的问题,它仍然只是从今天开始提取案例笔记。是否有不同的方法来获取每个参与者的最新案例笔记,即使最近的案例笔记是 4 个月前的?再次感谢您抽出宝贵时间查看此内容。
  • @Mike 能否提供两个表的定义和一些示例数据?想出解决方案会容易得多
  • 我在原始问题中添加了详细信息。看起来它没有采用 excel 导出格式。本质上,参与者将与案例笔记有一对多的关系。随着时间的推移,1 名参与者和许多案例说明。目标是隔离顶部或最大案例注释,以便我可以计算最近的案例注释日期和今天之间的日期差异,无论今天是什么时候运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-25
  • 1970-01-01
相关资源
最近更新 更多