我需要在00:15:00和01:15:00之间获取PRODUCT_ID的计数,并随后获取任何日期范围的计数.

示例脚本:-

我的数据库 struct 和数据如下.

CREATE TABLE time1 (cr_date date , product_id number );

insert into time1 values (to_date ('01-JAN-2022 01:00:00', 'DD_MON-YYYY HH:MI:SS') , 12345);
insert into time1 values (to_date ('01-JAN-2022 01:00:00', 'DD_MON-YYYY HH:MI:SS') , 12346);
insert into time1 values (to_date ('01-JAN-2022 01:00:00', 'DD_MON-YYYY HH:MI:SS') , 12347);
insert into time1 values (to_date ('01-JAN-2022 03:30:00', 'DD_MON-YYYY HH:MI:SS') , 42345);
insert into time1 values (to_date ('01-JAN-2022 03:30:00', 'DD_MON-YYYY HH:MI:SS') , 42346);
insert into time1 values (to_date ('01-JAN-2022 03:35:00', 'DD_MON-YYYY HH:MI:SS') , 42347);
insert into time1 values (to_date ('01-JAN-2022 03:40:00', 'DD_MON-YYYY HH:MI:SS') , 42348);
insert into time1 values (to_date ('01-JAN-2022 10:40:00', 'DD_MON-YYYY HH:MI:SS') , 10348);
insert into time1 values (to_date ('01-JAN-2022 10:42:00', 'DD_MON-YYYY HH:MI:SS') , 10349);
insert into time1 values (to_date ('01-JAN-2022 10:43:00', 'DD_MON-YYYY HH:MI:SS') , 11348);

COMMIT;

输出要求如下:-

| hours   | count |
|:------  |:------|
|00:15:00 |3|
|01:15:00 |0|
|02:15:00 |0|
|03:15:00 |0|
|04:15:00 |4|
|05:15:00 |0|
|06:15:00 |0|
|07:15:00 |0|
|08:15:00 |0|
|09:15:00 |0|
|10:15:00 |0|
|11:15:00 |3|
|..
|...
|23:15:00 |0|

推荐答案

您(最初)发布的样本数据几乎毫无用处,不涉及时间因素.

在我的一个表中,有一个datum列,值如下所示:

SQL> SELECT id, TO_CHAR (datum, 'hh24:mi') hrs FROM obr WHERE rownum <= 10;

        ID HRS
---------- -----
     21547 08:41
     21541 08:17
     21563 09:03
     21614 10:46
     21618 11:01
     21620 11:04
     21622 11:05
     21626 11:10
     21629 11:14
     21642 13:35

10 rows selected.

SQL>

这是一个查询

  • fmin中CTE创建24行(00:15,01:15,...23:15)
  • 根据前15分钟值(无论是在同一小时内,还是在前一小时内--取决于分钟)的datum进行连接

就这样.

SQL> WITH
  2     fmin
  3     AS
  4        (    SELECT TRUNC (SYSDATE) + (LEVEL - 1) / 24 + INTERVAL '15' MINUTE c_time
  5               FROM DUAL
  6         CONNECT BY LEVEL <= 24)
  7    SELECT TO_CHAR (f.c_time, 'hh24:mi') c_time, COUNT (z.id) cnt
  8      FROM fmin f
  9           LEFT JOIN obr z
 10              ON TO_CHAR (f.c_time, 'hh24:mi') =
 11                 TO_CHAR (
 12                      TRUNC (datum, 'hh24')
 13                    + CASE
 14                         WHEN TO_NUMBER (TO_CHAR (datum, 'mi')) >= 15
 15                         THEN
 16                            INTERVAL '15' MINUTE
 17                         WHEN TO_NUMBER (TO_CHAR (datum, 'mi')) < 15
 18                         THEN
 19                            INTERVAL '-45' MINUTE
 20                      END,
 21                    'hh24:mi')
 22  GROUP BY TO_CHAR (f.c_time, 'hh24:mi')
 23  ORDER BY 1;

结果:

C_TIM        CNT
----- ----------
00:15          0
01:15          0
02:15          0
03:15          0
04:15          0
05:15          0
06:15          0
07:15          2
08:15         10
09:15          1
10:15         14
11:15          6
12:15         10
13:15         38
14:15          5
15:15          0
16:15          0
17:15          0
18:15          0
19:15          0
20:15          0
21:15          0
22:15          0
23:15          0

24 rows selected.

SQL>

Sql相关问答推荐

使用sede获取不一定有两个不同标签的所有问题

提高写密集型表的查询性能

仅在特定字符串之后提取两个圆括号之间的计量单位文本

SQL SELECT MOST NEST TIMESTAMP BEAT ORDER

DBeaver将过程中的属性列表转换为字符串

对多个条件的SQL进行排名

使用SQL数据库中的现有列派生或修改几个列

使用拆分器将已分组的不同值连接在一起

PATINDEX中与[A-Z]匹配(U除外)的正则表达式

使用同一个表,为什么IN、NOT IN、NOT EXISTS和EXISTS有不同的输出?

使用多个WITH子查询的替代方法

Netezza SQL:判断两个表是否相同

获取分布在同一行的列中的出现次数

每个分组最多 Select 最后 2 个值并并排显示它们

SAS proc freq 或 proc sql 获取数据子集和整个数据的频率

IN子句使用的表值用户定义函数参数

为什么在事务中未被后续使用的CTE执行SELECT...FOR UPDATE无效?

当该日期的至少两条记录具有相同的持续时间或至少一条记录的持续时间为 0 时,如何标记该日期的所有记录

oracle中多行的跨日期范围的交集

并非所有变量都绑定在 PL SQL 函数中