sql—一段时间内的值频率(例如上周、上月、去年)

sql—一段时间内的值频率(例如上周、上月、去年),sql,postgresql,Sql,Postgresql,我有两个相关的栏目,名字和日期。我对创建新的列感兴趣,这些列跟踪一个名字在过去一周、过去一个月和过去一年中被记录的次数 通过为每个时间段创建一个新表,我做得很笨拙,例如: create table past_week as select name, date, count(*) as past_week from original_table where date between date - interval '7 days' and date group by name, date orde

我有两个相关的栏目,名字和日期。我对创建新的列感兴趣,这些列跟踪一个名字在过去一周、过去一个月和过去一年中被记录的次数

通过为每个时间段创建一个新表,我做得很笨拙,例如:

create table past_week as
select name, date, count(*) as past_week
from original_table
where date between date - interval '7 days' and date
group by name, date
order by date
然后,我将该表与原始表合并:

select * 
from original_table o
    left join past_week pw on o.name = p.name and o.date = pw.date

有没有更好的方法在不创建新表或不连接原始表的情况下执行此操作?谢谢

无需创建额外的表,尽管您必须将表与自身连接起来,至少是将其分组

在第二个查询中,只需使用第一个查询替换过去的_week表,如所示:

select * 
  from original_table o
  left join (
    select name, date, count(*) as past_week
      from original_table
      where date between date - interval '7 days' and date
      group by name, date
    ) pw on o.name = p.name and o.date = pw.date

单值子查询可用于选择:

select name, date,
(
  select count(*)
    from original o2
   where o2.name = o1.name
     and o2.date <@ daterange(o1.date - 7, o1.date)
) as past_week
from original o1
group by 1,2
order by 1,2

是的,当然有。你的数据库是什么?我认为你无法摆脱连接本身。实际上,您有两个单独的聚合级别:1个普通行,2个在上周分组期间计数行。我不明白你怎么能在这里施展其他魔法。你担心什么?性能,维护过程中的复杂性,其他?只是对SQL的新认识,并尝试学习最佳实践。我接受了你的回答。我查看了这个查询和我的原始查询的输出,我意识到它并没有做我想让它做的事情-它只是根据日期分组并返回该日期的计数,即日期之间的日期-间隔“7天”和日期总是返回真值。你对如何在一周内将以前的日期组合在一起有什么建议吗?