每周查找活动

时间:2019-09-11 15:31:59

标签: sql sql-server

我需要每周回顾两年,以查看一周是否有多个事件。就像如果7/1 / 19-7 / 8/19如果有3个事件,该成员将出现。除了每周都有大量案件陈述之外,还有其他方法可以这样做吗?像case when event = y and event_date between todate('07/01/2019','mm/dd/yyyy') and todate('07/08/2019','mm/dd/yyyy') then 1 else 0 end。我需要整整104个星期这样做吗?

select distinct prov
,svcdate
,svccod
,membno
,unitct
from claim
where svcdate > '20170911'

该查询返回名称-自行车商店,svcdate(事件日期)-'20180812,代码-h499,成员ID-456和单位-5

谢谢。

1 个答案:

答案 0 :(得分:0)

您可以按年份中的星期以及年份本身进行分组。然后,可以使用HAVING子句基于聚合进行过滤:

--Set up example test table and populate with example data
DECLARE @Events TABLE (eventDate DATETIME)
INSERT INTO @Events VALUES ('20180101'), ('20180102'), ('20180103')

SELECT DATEPART(wk, eventDate), DATEPART(year, eventDate)
FROM @Events 
WHERE eventDate BETWEEN @START_DATE AND @END_DATE
GROUP BY DATEPART(wk, eventDate), DATEPART(year, eventDate)
having COUNT(1) > 1

上面的代码将返回星期数和年份,您可以将其转换为更友好的形式。

编辑:再次考虑这个问题-这可能取决于a)您是否对几周内有多个事件的 感兴趣或b)内有多个指定事件的 em>。如果是a),则可以采用更简单的WHERE EXISTS(我不确定该表中的PK是什么,因此将其称为ClaimID):

SELECT * 
FROM claim c
WHERE EXISTS (SELECT 1 
              FROM claim c2 
              WHERE c.claimID > c2.claimID
              and (DATEPART(dw, c.svcdate) = DATEPART(dw, c2.svcdate) AND DATEPART(year, c.svcdate) = DATEPART(year, c2.svcdate))

如果您在数周内有n个或更多事件,则上述内容会下降-那么我认为第一个示例效果更好。

这还取决于您要获得什么输出-是在声明行本身之后还是仅在日期列表之后?