oracle中如何根据周排除数据
How to exclude data based on the weeks in oracle
CREATE TABLE states_tab (
id NUMBER(10),
states VARCHAR2(50),
action VARCHAR2(50),
schedule_time DATE,
CONSTRAINT pk_states_tab PRIMARY KEY ( id )
);
INSERT INTO states_tab VALUES(1,'Albania','Rejected','07-03-22');
INSERT INTO states_tab VALUES(2,'Albania','Approved','07-03-22');
INSERT INTO states_tab VALUES(3,'Albania','Rejected','28-02-22');
INSERT INTO states_tab VALUES(4,'Albania','Approved','21-02-22');
INSERT INTO states_tab VALUES(5,'Albania','Reviewed','14-02-22');
INSERT INTO states_tab VALUES(6,'Albania','Reviewed','14-02-22');
INSERT INTO states_tab VALUES(7,'Albania','Reviewed','07-02-22');
commit;
嗨团队,
以上是我需要根据日期提取数据的一些示例数据。例如,在我的示例数据中,我有从 2 月 7 日到 3 月 7 日的数据。但我只需要过去 4 周的数据,即到 2 月 14 日。因此,我需要排除第 4 周之后的数据。下面是我的尝试。
SELECT
states,
schedule_time,
SUM(decode(action, 'Rejected', 1, 0)) reject_count,
SUM(decode(action, 'Approved', 1, 0)) approve_count,
SUM(decode(action, 'Reviewed', 1, 0)) review_count
FROM
states_tab
GROUP BY
states,
schedule_time
ORDER BY schedule_time DESC ;
从上面的查询中,我得到了所有记录,但我需要限制从 2022 年 3 月 7 日起第 4 周之后的记录。
预期输出:
+---------+----------------+---------------+----------------+---------------+
| States | Schedule_TIME | REJECT_COUNT | APPROVE_COUNT | REVIEW_COUNT |
+---------+----------------+---------------+----------------+---------------+
| Albania | 07-03-22 | 1 | 1 | 0 |
| Albania | 28-02-22 | 1 | 0 | 0 |
| Albania | 21-02-22 | 0 | 1 | 0 |
| Albania | 14-02-22 | 0 | 0 | 2 |
+---------+----------------+---------------+----------------+---------------+
只是我需要从现有查询中排除第 4 周的记录。其余输出符合我的尝试,但我如何才能排除第 4 周后的数据?
注意:从当前日期开始,我只需要过去 4 周的数据,无论存在多少条记录,我只需要到第 4 周的数据。这个我做不到
使用的工具:Oracle SQL Developer(18c)
很抱歉通知您,但是 - 您实际上 是 4 周前得到的。您期望的结果是 3 周前。
SQL> select sysdate,
2 trunc(sysdate) - (4 * 7) four_weeks,
3 trunc(sysdate) - (3 * 7) three_Weeks
4 from dual;
SYSDATE FOUR_WEEKS THREE_WEEK
---------- ---------- ----------
07.03.2022 07.02.2022 14.02.2022
无论如何 - 无论您需要哪个时期,如果您过滤数据,您将获得数据,这是通过 WHERE 子句完成的(参见第 8 行):
SQL> SELECT
2 states,
3 schedule_time,
4 SUM(decode(action, 'Rejected', 1, 0)) reject_count,
5 SUM(decode(action, 'Approved', 1, 0)) approve_count,
6 SUM(decode(action, 'Reviewed', 1, 0)) review_count
7 FROM states_tab
8 where schedule_time >= trunc(sysdate) - (3 * 7)
9 GROUP BY
10 states,
11 schedule_time
12 ORDER BY schedule_time DESC ;
STATES SCHEDULE_T REJECT_COUNT APPROVE_COUNT REVIEW_COUNT
--------------- ---------- ------------ ------------- ------------
Albania 07.03.2022 1 1 0
Albania 28.02.2022 1 0 0
Albania 21.02.2022 0 1 0
Albania 14.02.2022 0 0 2
SQL>
CREATE TABLE states_tab (
id NUMBER(10),
states VARCHAR2(50),
action VARCHAR2(50),
schedule_time DATE,
CONSTRAINT pk_states_tab PRIMARY KEY ( id )
);
INSERT INTO states_tab VALUES(1,'Albania','Rejected','07-03-22');
INSERT INTO states_tab VALUES(2,'Albania','Approved','07-03-22');
INSERT INTO states_tab VALUES(3,'Albania','Rejected','28-02-22');
INSERT INTO states_tab VALUES(4,'Albania','Approved','21-02-22');
INSERT INTO states_tab VALUES(5,'Albania','Reviewed','14-02-22');
INSERT INTO states_tab VALUES(6,'Albania','Reviewed','14-02-22');
INSERT INTO states_tab VALUES(7,'Albania','Reviewed','07-02-22');
commit;
嗨团队, 以上是我需要根据日期提取数据的一些示例数据。例如,在我的示例数据中,我有从 2 月 7 日到 3 月 7 日的数据。但我只需要过去 4 周的数据,即到 2 月 14 日。因此,我需要排除第 4 周之后的数据。下面是我的尝试。
SELECT
states,
schedule_time,
SUM(decode(action, 'Rejected', 1, 0)) reject_count,
SUM(decode(action, 'Approved', 1, 0)) approve_count,
SUM(decode(action, 'Reviewed', 1, 0)) review_count
FROM
states_tab
GROUP BY
states,
schedule_time
ORDER BY schedule_time DESC ;
从上面的查询中,我得到了所有记录,但我需要限制从 2022 年 3 月 7 日起第 4 周之后的记录。
预期输出:
+---------+----------------+---------------+----------------+---------------+
| States | Schedule_TIME | REJECT_COUNT | APPROVE_COUNT | REVIEW_COUNT |
+---------+----------------+---------------+----------------+---------------+
| Albania | 07-03-22 | 1 | 1 | 0 |
| Albania | 28-02-22 | 1 | 0 | 0 |
| Albania | 21-02-22 | 0 | 1 | 0 |
| Albania | 14-02-22 | 0 | 0 | 2 |
+---------+----------------+---------------+----------------+---------------+
只是我需要从现有查询中排除第 4 周的记录。其余输出符合我的尝试,但我如何才能排除第 4 周后的数据?
注意:从当前日期开始,我只需要过去 4 周的数据,无论存在多少条记录,我只需要到第 4 周的数据。这个我做不到
使用的工具:Oracle SQL Developer(18c)
很抱歉通知您,但是 - 您实际上 是 4 周前得到的。您期望的结果是 3 周前。
SQL> select sysdate,
2 trunc(sysdate) - (4 * 7) four_weeks,
3 trunc(sysdate) - (3 * 7) three_Weeks
4 from dual;
SYSDATE FOUR_WEEKS THREE_WEEK
---------- ---------- ----------
07.03.2022 07.02.2022 14.02.2022
无论如何 - 无论您需要哪个时期,如果您过滤数据,您将获得数据,这是通过 WHERE 子句完成的(参见第 8 行):
SQL> SELECT
2 states,
3 schedule_time,
4 SUM(decode(action, 'Rejected', 1, 0)) reject_count,
5 SUM(decode(action, 'Approved', 1, 0)) approve_count,
6 SUM(decode(action, 'Reviewed', 1, 0)) review_count
7 FROM states_tab
8 where schedule_time >= trunc(sysdate) - (3 * 7)
9 GROUP BY
10 states,
11 schedule_time
12 ORDER BY schedule_time DESC ;
STATES SCHEDULE_T REJECT_COUNT APPROVE_COUNT REVIEW_COUNT
--------------- ---------- ------------ ------------- ------------
Albania 07.03.2022 1 1 0
Albania 28.02.2022 1 0 0
Albania 21.02.2022 0 1 0
Albania 14.02.2022 0 0 2
SQL>