选择日期范围内的所有行,最后一个月中至少有一行

时间:2016-05-05 18:03:07

标签: sql-server

我已经完成了这个想法,我不确定如何做到这一点。 我将向您提供我当前的查询,该查询为我提供了日期范围所需的行;

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字段一样。

有没有人有任何想法?

谢谢, Kramb

澄清:

简明数据:

  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确实有多个事件,但由于这些事件未在第二个参数的月份发生,因此未返回行。

1 个答案:

答案 0 :(得分:1)

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

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