![](/img/trans.png)
[英]How to Calculate Days,Weeks,Month,Year difference from Today's Date in SQL?
[英]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.