如何给条件分组?

时间:2019-03-07 15:28:39

标签: sql postgresql datetime

从时间7:00:00 am到第二天6:59:59 am,我需要使用PostgreSQL获取记录计数,然后从7:00am to 6:59:59 am重新设置计数。

我将后端用作Java(春季启动)的地方。

我表中的列是

  • id(primary_id)
  • createdon(时间戳)
  • 名称
  • 部门
  • 创建者

我如何给明智的换班条件?

3 个答案:

答案 0 :(得分:2)

您需要根据当前时间选择一个切片(我假设这是某种计数器,它将在某些应用程序中自动刷新)。

一种方法是使用时间范围:

SELECT COUNT(*)
FROM mytable
WHERE createdon <@ (
    SELECT CASE
        WHEN current_time < '07:00'::time THEN
            tsrange(CURRENT_DATE - '1d'::interval + '07:00'::time, CURRENT_DATE + '07:00'::time, '[)')
        ELSE
            tsrange(CURRENT_DATE + '07:00'::time, CURRENT_DATE + '1d'::interval + '07:00'::time, '[)')
        END
)
;

数据示例:https://rextester.com/LGIJ9639

答案 1 :(得分:0)

您可以使用聚合-减去7个小时:

select (createdon - interval '7 hour')::date as dy, count(*)
from t
group by dy
order by dy;

答案 2 :(得分:0)

据我所知,在每个24小时内从07:00:00开始的值中,您需要有一个单独的组。

SELECT
    (
        date_trunc('day', (createdon - '7h'::interval))
            + '7h'::interval
    ) AS date_bucket,
    count(id) AS count
FROM lorem
GROUP BY date_bucket
ORDER BY date_bucket

这使用了date and time functionsGROUP BY clause

  • 将时间戳记值后退7小时((createdon - '7h'::interval)),因此可以通过更改日期(在00:00:00)来区分。然后,

  • 将值截断为日期(date_trunc('day', …)),以便将存储桶中的所有值展平为单个值(午夜的日期)。然后,

  • 再次将7小时添加到值(… + '7h'::interval)中,以便它代表存储桶的开始时间。然后,

  • 按该值(GROUP BY date_bucket)分组。


包含模式和数据的更完整示例:

DROP TABLE IF EXISTS lorem;
CREATE TABLE lorem (
    id serial PRIMARY KEY,
    createdon timestamp not null
);

INSERT INTO lorem (createdon) (
    SELECT
        generate_series(
            CURRENT_TIMESTAMP - '36h'::interval,
            CURRENT_TIMESTAMP + '36h'::interval,
           '45m'::interval)
);

现在查询:

SELECT
    (
        date_trunc('day', (createdon - '7h'::interval))
            + '7h'::interval
    ) AS date_bucket,
    count(id) AS count
FROM lorem
GROUP BY date_bucket
ORDER BY date_bucket
;

产生以下结果:

     date_bucket     | count 
---------------------+-------
 2019-03-06 07:00:00 |    17
 2019-03-07 07:00:00 |    32
 2019-03-08 07:00:00 |    32
 2019-03-09 07:00:00 |    16
(4 rows)