计算每个影响者在一段时间内的追随者增长情况。

问题描述 投票:1回答:2

date

influencer_id |     date     |    followers
     1        | 2020-05-29   |      7361
     1        | 2020-05-28   |      7234
                    ...
     2        | 2020-05-29   |       82
     2        | 2020-05-28   |       85
                    ...
     3        | 2020-05-29   |      3434
     3        | 2020-05-28   |      2988
     3        | 2020-05-27   |      2765
                    ...

比如说我想计算一下每个影响者在过去7天里获得了多少粉丝 然后得到以下表格。

influencer_id |                       growth
     1        |  <num followers last day - num followers first day>
     2        |                         "
     3        |                         "

作为第一次尝试,我这样做了。

SELECT influencer_id,
      (MAX(followers) - MIN(followers)) AS growth
FROM influencer_follower_daily
WHERE date < '2020-05-30'
AND date >= '2020-05-23'
GROUP BY influencer_id;

这个方法可行,可以显示每个影响者一周内的增长情况。但是,它假设粉丝数总是增加,人们永远不会取消关注!

那么有没有一种方法可以在原始表上使用SQL查询来实现我想要的东西呢?或者说我必须要用一个新的表来生成一个全新的表。FOR 循环计算每个日期之间的+-关注者变化列?

sql database postgresql aggregate-functions greatest-n-per-group
2个回答
1
投票

优化GROUP BY查询以获取每个用户的最新记录first()如果适用,我建议你开始一个新的问题,披露确切的表定义和基数......。last()密切相关。

从每组的第一行和最后一行获取值array_agg()

PostgreSQL:通过子句连接组内的数组。使用类似于TOP与GROUP BYarray_agg()从分组列中取样重复值的最佳性能。ORDER BY Postgres没有一个

SELECT influencer_id, arr[array_upper(arr, 1)] - arr[1]
FROM  (
   SELECT influencer_id, array_agg(followers) AS arr
   FROM  (
      SELECT influencer_id, followers
      FROM   influencer_follower_daily
      WHERE  date >= '2020-05-23'
      AND    date <  '2020-05-30'
      ORDER  BY influencer_id, date
      ) sub1
   GROUP  BY influencer_id
   ) sub2;

聚合函数。 一种方法是。另一种方法是使用数组。 sub1

© www.soinside.com 2019 - 2024. All rights reserved.