0

我正在使用 MySQL 在另一列中为每个类别创建一个窗口函数。我正在考虑将数据透视表与窗口函数结合起来,但是,不知道如何用 MySQL 做数据透视表。

以下是我要做的事情,为每个类别创建一个列并计算给定时间范围内的平均值:

我有:

类别 数量 时间戳
汤姆 头发 1 2020-06-21
克里斯 丹尼 学校 2 2020-06-22
哎呀 艾丽 图书 1 2020-06-21
汤姆 图书 10 2020-06-23
克里斯 丹尼 头发 2 2020-06-25
哎呀 艾丽 学校 15 2020-06-28

我想:

hair_last_3_days school_last_3_days boks_last_3_days
汤姆 1 1 21
克里斯 丹尼 2 2 202
哎呀 艾丽 2 1 1
汤姆 4 10 6
克里斯 丹尼 3 2 0
哎呀 艾丽 2 15 28

目前我能够创建平均值

select first, last, date(trans_date_trans_time), amt, category,
avg(amt) over(partition by first, last, category order by date(trans_date_trans_time) ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) avg_last_3 from table;

但是,我意识到这只有在一天接一天的情况下才有效,如果一个人在同一天有两行,这将不起作用。我正在寻求帮助。谢谢

4

2 回答 2

0

如果您有全天的数据,那么您可以在以下位置使用条件逻辑avg()

select first, last, date(trans_date_trans_time), amt, category,
       avg(case when category = 'hair' then amt enfd) over
           (partition by first, last, category
            order by date(trans_date_trans_time)
            ROWS BETWEEN 2 PRECEDING AND CURRENT ROW
           ) as avg_hair_last_3
from table;

但更好的解决方案是使用时间窗口框架:

select first, last, date(trans_date_trans_time), amt, category,
       avg(case when category = 'hair' then amt enfd) over
           (partition by first, last, category
            order by date(trans_date_trans_time)
            rows between interval 2 day preceding and current row
           ) as avg_hair_last_3
from table;
于 2021-06-02T12:29:34.637 回答
0

如果是我,我会执行类似以下的操作,并处理应用程序代码中的任何剩余问题......

SELECT x.firstname
     , x.lastname
     , x.category
     , SUM(amount) total
  FROM my_table x
  JOIN 
     ( SELECT firstname  
            , lastname
            , category
            , MAX(timestamp) timestamp
         FROM my_table
        GROUP 
           BY firstname
            , lastname
            , category
     ) y
    ON y.firstname = x.firstname 
   AND y.lastname = x.lastname
   AND y.category = x.category
   AND x.timestamp BETWEEN y.timestamp - INTERVAL 2 DAY AND y.timestamp
 GROUP
    BY x.firstname
     , x.lastname
     , x.category 

请注意,这不是任何事情的“平均值”,因为我并不真正了解您的结果集如何与您的数据集匹配。

于 2021-06-02T13:04:46.810 回答