【问题标题】:Select all rows within a date range, with at least one row occurring in the last given month选择日期范围内的所有行,至少有一行出现在上一个给定月份
【发布时间】:2016-05-05 18:03:06
【问题描述】:

我已经没有这个想法了,我不知道该怎么做。 我会给你我当前的查询,给我日期范围所需的行;

WITH CTE AS
(SELECT FER.*, COUNT(*) OVER (PARTITION BY FER.Report_Subject, FER.Event_Category) AS Event_Count
FROM FacilityEventReport FER INNER JOIN
FacilityEventReport_RMReview RMR ON FER.ID = RMR.FER_ID
WHERE RMR.Review_Status = 'Active' AND FER.Report_About = 'Resident' AND @BeginDate <= FER.Event_Date AND @EndDate >= FER.Event_Date AND (LEN(ISNULL(@Category,'')) = 0) OR @Category = FER.Event_Category)
SELECT *
FROM CTE
WHERE Event_Count > 1
ORDER BY Report_Subject

以上查询返回日期参数@BeginDate 和@EndDate 内发生的所有事件。 @Category 是可选参数,仅用于按 Event_Category 过滤查询。此查询返回所有请求的行,但我需要至少有一个返回的行位于第二个日期参数 (@EndDate) 的 MONTH 中。

此查询用于报告。

参数@BeginDate 和@EndDate 都是DateTime 类型。 Event_Date 字段也是如此。

有人有什么想法吗?

谢谢, 克拉姆

澄清:

精简数据:

  Event_Date  |  Report_Subject  |  Event_Category
----------------------------------------------------
2016-01-01    |  Patient 1       |  Aggressive Act
2016-01-02    |  Patient 1       |  Aggressive Act
2016-02-01    |  Patient 1       |  Aggressive Act
2016-01-01    |  Patient 2       |  Fall
2016-01-02    |  Patient 2       |  Fall
2016-03-01    |  Patient 3       |  Fall

如果我使用以下参数运行查询:

@BeginDate = '2016-01-01';
@EndDate   = '2016-02-01';

我想要返回以下数据:

  Event_Date  |  Report_Subject  |  Event_Category
----------------------------------------------------
2016-01-01    |  Patient 1       |  Aggressive Act
2016-01-02    |  Patient 1       |  Aggressive Act
2016-02-01    |  Patient 1       |  Aggressive Act

请注意,返回患者 1 是因为他们有多个相同类型的事件。另外,在第二个参数的月份内发生了一个事件。

患者 2 确实有不止一个事件,但因为这些事件没有发生在第二个参数的月份,所以没有返回行。

【问题讨论】:

  • 您是说需要返回 EndDate 月份的行,即使您的数据库中没有这样的行?
  • 否,结果按报告主题和事件类别分组。如果报告主题在某一日期范围内有多个事件类别,则查询将返回所有这些行。我需要其中一个返回的行位于第二个日期参数 (@EndDate) 的月份内。如果第二个月内没有任何事件,则不应为该报告主题返回任何行。
  • 我无法想象您所描述的内容。您可以添加示例数据、当前结果和所需结果吗?
  • 当然,没问题。给我一分钟时间来设置它。
  • 好的,所以问题是,如果患者在上个月没有任何行,那么您不希望为该患者返回任何行吗?

标签: sql-server


【解决方案1】:

有很多方法。一种是将其添加到当前查询的末尾:

...
AND EXISTS(
  SELECT * 
  FROM CTE t2 WHERE t2.Report_Subject=CTE.Report_Subject
  AND DATEDIFF(Month, Event_Date, @EndDate)=0
)

【讨论】:

  • 太棒了!太感谢你了,我的脑子已经糊涂了。幸运的是,这是大约 20 个报告查询中的最后一个。
  • 说得太早了,我仍然得到不在 @EndDate 参数月份的结果。
  • 你能举一个你不应该得到的结果的例子吗?您是否考虑了 CTE 中的 JOIN 是否消除了这些行?
  • 这不是 JOIN。 EXISTS 正在消除行。基本上我需要将结果集作为一个组,因为如果 CTE 中的一个行与 EndDate 匹配,我仍然需要返回 CTE 中的所有行
  • EXISTS 不会消除这些行。我必须看一个你所看到的例子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 2020-04-01
  • 1970-01-01
  • 2012-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多