Database design 如何根据时间和每个时间和id的值之和获取频率?我尝试使用聚合函数,但没有。

Database design 如何根据时间和每个时间和id的值之和获取频率?我尝试使用聚合函数,但没有。,database-design,aggregate,Database Design,Aggregate,我有如下数据X。我尝试使用聚合函数,但没有 X 有了下面的数据,我想创建新的变量freq、monthly amount和max month。 freq是每个月的时间数,例如id 1有3个频率,第1个月有3个频率,第2个月有2个频率,依此类推 sum_amount是每个月的金额总和,例如,第一个月的sum_amount是104+5+1,依此类推。 max_month是每个id的最大月份,例如id 1有5个max month id 2有4个,如此类推 因此,我希望以如下格式获得每个id的汇总结果,也

我有如下数据X。我尝试使用聚合函数,但没有

X

有了下面的数据,我想创建新的变量freq、monthly amount和max month。 freq是每个月的时间数,例如id 1有3个频率,第1个月有3个频率,第2个月有2个频率,依此类推 sum_amount是每个月的金额总和,例如,第一个月的sum_amount是104+5+1,依此类推。 max_month是每个id的最大月份,例如id 1有5个max month id 2有4个,如此类推 因此,我希望以如下格式获得每个id的汇总结果,也就是说,希望汇总如下所示的数据:

     id time  freq   sum_amount   max_month
             (month) 
1    1           3     10          5
1    2           2     4           5
     .
     .
     .

我不认为我会以这种方式提供信息。将列max_month加入到其他聚合时会产生误导

让我们做一张桌子。你以后应该自己做这部分。它让我们能够快速地将工作代码粘贴到我们自己的dbms中,并且每个人都在使用相同的数据

create table test (
  id integer not null,
  time integer not null,
  amount integer not null
);

insert into test values
(1, 1, 4), (1, 1, 5), (1, 1, 1), (1, 2, 3), (1, 2, 1),
(1, 3, 8), (1, 3, 9), (1, 4, 1), (1, 4, 7), (1, 5, 5),
(1, 1, 4), (2, 1, 5), (2, 2, 9), (2, 2, 7), (2, 3, -1),
(2, 3, 3), (2, 4, 8);
除去max_month,查询很简单

select id, time, count(time) as freq, sum(amount) as sum_amount
from test
group by id, time
order by id, time;

但是,说真的,不要那样做。不要这样做。

列可以是非键列的函数。不太清楚。这可能更方便。例如,将信息放在一个表中。没有一张表是在事先不知道它的意思的情况下可以阅读的。这一点很清楚:它的行表示表的行所表示的连接。没有必要只将一行视为说明其键子代码或实体。它指出;关于形势,;通过它的价值观。缺席的行也是如此。如果它表示每个键子视图/实体,则表示每个超级键子视图/实体。不支持粗体/斜体段落。可以将列作为非键列的函数。当然,但这不是非键列的函数。它是不同行的函数;它混合了两种不同的聚合级别。我只是想解释一下你对每一个[关键点]所说的具体内容。因此,它是一些列和表的函数。那也可以。一切都好。这是一个查询,不是基数。好的,一个或多个查询的分解可能更清晰。你的许多理由都是似是而非的。正如你评论中的反对意见一样。它混合了:但无论从理论上还是实践上,这都不是问题。例如,他的查询意思是id[id]在月[time]内支付[freq]次,总计$[sum\u amount],而他们在一年中的最后一个月是[max\u time]。
select id, time, count(time) as freq, sum(amount) as sum_amount
from test
group by id, time
order by id, time;
id time freq sum_amount -- 1 1 4 14 1 2 2 4 1 3 2 17 1 4 2 8 1 5 1 5 2 1 1 5 2 2 2 16 2 3 2 2 2 4 1 8
select id, max(time)
from test
group by id;
id max -- 1 5 2 4 id time freq sum_amount max_time -- 1 1 4 14 5 1 2 2 4 5 1 3 2 17 5 1 4 2 8 5 1 5 1 5 5 2 1 1 5 4 2 2 2 16 4 2 3 2 2 4 2 4 1 8 4
with max_times as (
  select id, max(time) max_time
  from test
  group by id
), other_aggregates as (
  select id, time, count(time) as freq, sum(amount) as sum_amount
  from test
  group by id, time
)
select t2.*, t1.max_time 
from max_times t1
inner join other_aggregates t2
on t1.id = t2.id
order by id, time;