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>