簡體   English   中英

如何從 Presto 的 SQL (Athena) 中從一年開始計算每個月的平均值?

[英]How to calculate average for every month from start from year in Presto's SQL (Athena)?

以下是我擁有的表格數據的示例

| date       | value |
| 2020-01-01 |  20   |
| 2020-01-14 |  10   |
| 2020-02-02 |  30   |
| 2020-02-11 |  25   |
| 2020-02-25 |  25   |
| 2020-03-13 |  34   |
| 2020-03-21 |  10   |
| 2020-04-06 |  55   |
| 2020-04-07 |  11   |

我想生成如下結果集

| date       | value |  average                       |
| 2020-01-01 |  20   |  Jan average                   |
| 2020-01-14 |  10   |  Jan average                   |   
| 2020-02-02 |  30   |  Jan & Feb average             |
| 2020-02-11 |  25   |  Jan & Feb average             |
| 2020-02-25 |  25   |  Jan & Feb average             |
| 2020-03-13 |  34   |  Jan & Feb & Mar average       |
| 2020-03-21 |  10   |  Jan & Feb & Mar average       |
| 2020-04-06 |  55   |  Jan & Feb & Mar & Apr average |
| 2020-04-07 |  11   |  Jan & Feb & Mar & Apr average |

我嘗試使用 window function OVER() 和 PARTITION() 但我設法逐月獲得平均值,而不是從一年開始。

請有任何建議。

謝謝

不確定我是否理解您的問題,但如果您想要的只是逐年限制的每一行的運行平均值:

SELECT date, value, (
  SELECT AVG(value)
  FROM data ds
  WHERE ds.date <= d.date AND YEAR(ds.date) = YEAR(d.date)
) average
FROM data d
ORDER BY d.date ASC;

MySQL 示例(此特定查詢的語法相同)

如果您想在平均值中包含同一個月的后續行,請使用WHERE MONTH(ds.date) <= MONTH(d.date)

以下查詢應該給出您預期的輸出 -

在這里演示

SELECT A.*,
(
    SELECT AVG(Value * 1.00) 
    FROM your_table B 
    WHERE YEAR(B.Date) = YEAR(A.DAte) 
    AND MONTH(B.Date) <= MONTH(A.DAte)
)
FROM your_table A

此查詢將使您的 output 每年。 但是,如果您不希望按 YEAR 進行分區,只需從子查詢中刪除 YEAR 過濾器。

以下查詢將返回不考慮 YEAR 的 AVG,僅返回幾個月前的 AVG-

在這里演示

SELECT A.*,
(
    SELECT AVG(Value * 1.00) 
    FROM your_table B 
    WHERE B.date <= 
    (
        SELECT MAX(Date) 
        FROM your_table C
        WHERE YEAR(c.Date) = YEAR(A.Date)
        AND MONTH(C.Date) = MONTH(A.Date)
    )
)
FROM your_table A

我想你想要:

select 
    t.*,
    avg(value) over(
        partition by year(date)
        order by month(date)
    ) running_avg
from mytable t

這會將每年放在一個單獨的分區中,然后按月對分區行進行排序。

SELECT a.date,
    a.value,
     (Select avg(b.value) from myTable B where b.date < a.date and YEAR(a.date) = YEAR(b.date)) 
From myTable a

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM