【发布时间】:2020-06-23 05:33:50
【问题描述】:
我正在尝试从数据库日志表中创建按服务区域分组的活动设备的月度统计。我想我已经完成了 90%。我有一个月份列表,以及存在的项目总数,并按地区分组。
但是,我还需要知道每个项目在每个月的第一天的状态,这是我坚持的部分。例如,项目 1 在 1 月份位于区域 A,但在 2 月份移动到区域 B。项目 2 在 2 月被标记为“非活动”,因此不应计算在内。我现有的查询将始终将区域 A 中的项目 1 和项目 2 计为“活动”。
我可以正确地表明第 3 项在 3 月被删除,第 4 项直到 4 月计数才出现。我意识到我得到了第一个值,因为我的查询指定了最小日期,我只是不确定如何更改它以获得我想要的。
我想我正在寻找一种按 Max(OperationDate) 为每个月分组的方法。
表格如下所示:
| EQUIPID | EQUIPNAME | EQUIPACTIVE | DISTRICT | REGION | OPERATIONDATE | OPERATION |
|---------|-----------|-------------|----------|--------|----------------------|-----------|
| 1 | Item 1 | 1 | 1 | A | 2015-01-01T00:00:00Z | INS |
| 2 | Item 2 | 1 | 1 | A | 2015-01-01T00:00:00Z | INS |
| 3 | Item 3 | 1 | 1 | A | 2015-01-01T00:00:00Z | INS |
| 2 | Item 2 | 0 | 1 | A | 2015-02-10T00:00:00Z | UPD |
| 1 | Item 1 | 1 | 1 | B | 2015-02-15T00:00:00Z | UPD |
| 3 | (null) | (null) | (null) | (null) | 2015-02-21T00:00:00Z | DEL |
| 1 | Item 1 | 1 | 1 | A | 2015-03-01T00:00:00Z | UPD |
| 4 | Item 4 | 1 | 1 | B | 2015-03-10T00:00:00Z | INS |
还有一个包含我关心的属性的子表。它的结构类似。不幸的是,由于之前的设计决策,这两个表之间的操作没有关联。任何连接都需要使用 EquipmentID 完成,并为每个日期匹配重叠状态。
当前查询:
--cte to build date list
WITH calendar (dt) AS
(SELECT &fromdate from dual
UNION ALL
SELECT Add_Months(dt,1)
FROM calendar
WHERE dt < &todate)
SELECT dt, a.district, a.region, count(*)
FROM
(SELECT EQUIPID, DISTRICT, REGION, OPERATION, MIN(OPERATIONDATE ) AS FirstOp, deleted.deldate
FROM Equipment_Log
LEFT JOIN
(SELECT EQUIPID,MAX(OPERATIONDATE) as DelDate
FROM Equipment_Log
WHERE OPERATION = 'DEL'
GROUP BY EQUIPID
) Deleted
ON Equipment_Log.EQUIPID = Deleted.EQUIPID
WHERE OPERATION <> 'DEL' --AND additional unimportant filters
GROUP BY EQUIPID,DISTRICT, REGION , OPERATION, deldate
) a
INNER JOIN calendar
ON (calendar.dt >= FirstOp AND calendar.dt < deldate)
OR (calendar.dt >= FirstOp AND deldate is null)
LEFT JOIN
( SELECT EQUIPID, MAX(OPERATIONDATE) as latestop
FROM SpecialEquip_Table_Log
--where SpecialEquip filters
group by EQUIPID
) SpecialEquip
ON a.EQUIPID = SpecialEquip.EQUIPID and calendar.dt >= SpecialEquip.latestop
GROUP BY dt, district, region
ORDER BY dt, district, region
【问题讨论】:
-
如果一月份出现的项目,三月份被删除了,但是二月份的项目没有条目应该出现在二月份吗?
-
是的,没错。期待查看您提供的答案。