sql - oracle查询根据日期过滤器获取添加、更新和删除记录的计数
问题描述
我有一个如下表结构
ID OLDID col1 status
1 0 txt1 A - inserted record
2 0 txt1 I - deleted record
3 0 txt1 I - updated record
4 3 txt1 I - updated record
5 4 txt1 I - updated record
6 5 txt1 I - deleted record
7 0 txtx I - updated record
8 7 txt1 A - updated record
我想统计这张表中插入、更新和删除的记录,请帮我用oracle查询来获取记录的数量,下面是逻辑
- 新记录的逻辑是 ID 为新 ID,旧 ID 为 0,状态为 A。
- 更新记录的状态为 I,这条记录的 id 将插入到新记录的旧 id 列中。
- 旧 id 为 0 的已删除记录状态,第二个条件是状态为 I 并且 ID 不会在 OLD id 列中。
我已尽力解释此案,如果需要更多详细信息,请告诉我。帮助我进行oracle查询。
下面的查询似乎正在工作,但如果没有删除的记录,那么我想为它设置 0 但在下面的查询中只返回具有 >0 个计数的记录,请任何专家对其进行优化
SELECT sub.status, COUNT(*)
FROM (SELECT CASE
WHEN yt.oldid = 0 AND yt.status = 'A' THEN 'Insert'
WHEN yt.status = 'I' and QID not in (select oldid from FROM your_table where TO_CHAR (record_date,'MM/YYYY')='04/2020' ) THEN 'Delete'
ELSE 'Update' END AS status
FROM your_table yt where TO_CHAR (record_date,'MM/YYYY')='04/2020')
GROUP BY sub.status;
求高手帮忙看看。
解决方案
您可以使用CASE..WHEN
和 selfLEFT JOIN
如下:
SELECT T.*,
CASE WHEN T.OLDID = 0 AND T.STATUS = 'A' THEN 'Insert'
WHEN T.STATUS = 'I' AND T1.ID IS NOT NULL THEN 'Update'
WHEN T.STATUS = 'I' AND T.OLDID = 0 AND T1.ID IS NULL THEN 'Delete'
END AS RECORD_OP
FROM YOUR_TABLE T
LEFT JOIN YOUR_TABLE T1 ON T.ID = T1.OLDID
推荐阅读
- python - 将具有其他类的类转换为字典中的属性
- python - 在机器人框架中评估引号中的表达式失败
- datatables - 在初始化时过滤数据表:过滤具有空列的行
- c# - 如何在范围服务中使用 Microsoft.Extensions.LoggingLogger
- java - Spring boot - list all the files in the classpath
- oracle - 在 denodo oracle 数据库上投射日期会给出不同的格式
- automation - How to cut webdriver.io log(query DATA part)?
- java - How to get result from DB in batches of 1k or 2k?
- javascript - How to configure SSO for chatbot deployed on website
- android - 使用 ViewPager + NestedScrollView + RecyclerView 时的触摸事件拦截