PostgreSQL:在一段时间内计数大于X

时间:2019-01-27 20:23:28

标签: postgresql

我有一张桌子sales,每销售一件商品就有一个条目。我想确定两天内售出300件以上的商品。我有以下工作查询,这些查询返回一日内销售超过300的那些物品。如何修改此查询以涵盖两天的时间?

我需要同时返回日期和计数。不幸的是,sold_date的列类型是date,而不是date_time

select 
    item_id, sold_date, count(*) as cnt
from 
    sales
group by 
    item_id, sold_date
having 
   count(*)  > 300;

我正在使用PostgreSQL 11.1

sales中的数据示例:

item_id sold_date
102836  '2016-04-04'
102836  '2016-02-08'
102836  '2016-02-08'
102836  '2016-01-25'
102836  '2016-01-11'
102836  '2016-02-08'
102836  '2016-02-08'
102836  '2016-04-04'
102836  '2016-02-29'
102836  '2016-02-22'
102836  '2016-03-28'
102836  '2016-02-29'

预期输出示例:

item_id sold_date       cnt
130229  '2019-01-22'    '328'
81567   '2018-04-18'    '368'
76915   '2019-01-22'    '339'
95761   '2019-01-22'    '318'
84732   '2019-01-22'    '307'
83095   '2019-01-22'    '329'
101076  '2019-01-22'    '311'
84458   '2019-01-22'    '301'
84408   '2019-01-22'    '313'
97428   '2019-01-22'    '339'

输出中的sold_date还包括前一天或后一天。

1 个答案:

答案 0 :(得分:0)

可以在现在到

前两天之间使用
select item_id, count(*) as cnt
from  sales
where  sold_date between (now() - intervat '1 day') and now()
group by  item_id
having   count(*)  > 300;

对于2天之间的所有两天项目,您可以使用子查询并加入

select item_id, count(*) as cnt
from  sales
inner join  (

  select  distinct sold_date end_date, sold_date  - intervat '2 day' start_date
  from  sales
) t on  sales between start_date and end_date
group by  item_id
having   count(*)  > 300;