SQL:将每日数据除以每月索引
Posted
技术标签:
【中文标题】SQL:将每日数据除以每月索引【英文标题】:SQL: Dividing daily data by a monthly index 【发布时间】:2016-10-26 17:49:26 【问题描述】:我有作为此查询产品的每日交易数据:
SELECT transaction_date ,
Merchant,
Amount
into transaction.table
FROM source.table
WHERE (DESCRIPTION iLIKE '%Criteria%')
字段 transaction_date 的格式为 DATE (yyyy-MM-dd)。
我想做的是获取 transaction.table 中的每一行/交易,然后将 Amount 除以与其相应月份相关的值(这是键),该值包含在名为 Calendar 的单独表中。
从同一个 source.table 查询名为 Calendar 的单独表,如下所示:
select month,count(*) as distinct_month
into source.Calendar
from
(
select Population, to_char(optimized_transaction_date, 'YYYY-MM') as month
FROM source.table
group by Population, to_char(optimized_transaction_date, 'YYYY-MM')
)
group by month
我的目标是为每一天获取一个值:Amount / distinct_month。
关键部分是将第一个查询中的每日数据(transaction_date)与第二个查询(月份)中的每月数据匹配。
请注意,第二个查询中的月份是 varchar,而第一个查询中的 transact_date 是 DATE。
【问题讨论】:
【参考方案1】:我想你想要这样的东西:
SELECT transaction_date, Merchant, Amount, newval
FROM (SELECT transaction_date, Merchant, Amount, Description,
(Amount / count(distinct population) over (partition by to_char(transaction_date, 'YYYY-MM')
) as newval
FROM source.table
) t
WHERE DESCRIPTION iLIKE '%Criteria%';
您只需要子查询,因为总计是根据所有数据计算的,没有过滤条件。
编辑:
糟糕,我忘记了 Postgres 不支持 COUNT(DISTINCT)
作为窗口函数。这样做:
SELECT transaction_date, Merchant, Amount, newval
FROM (SELECT t.*,
(Amount / SUM( (seqnum = 1)::int) OVER (partition by to_char(transaction_date, 'YYYY-MM') )
) as newval
FROM (SELECT t.*,
ROW_NUMBER() OVER (PARTITION BY partition by to_char(transaction_date, 'YYYY-MM'), population ORDER BY population) as seqnum
FROM source.table t
) t
) t
WHERE DESCRIPTION iLIKE '%Criteria%';
【讨论】:
谢谢。我尝试了这段代码并得到:“描述”在 t 中不存在。”你打算对 t 做什么?代码中还有其他更正吗?谢谢。 @ZJAY 。 . .我没有注意到WHERE
子句中使用的字段没有被选中。
对不起,我不关注。你能澄清一下吗?感谢您帮助解决这个问题。
@ZJAY 。 . .我修复了查询。最外层的WHERE
子句使用了未在子查询中选择的列。
你太棒了,这行得通!但是,加载此查询需要很长时间 - 我不认为有更有效的编写方式。以上是关于SQL:将每日数据除以每月索引的主要内容,如果未能解决你的问题,请参考以下文章
Python 将每月和分钟数据帧与 TZ 感知的日期时间索引相结合
在 Elasticsearch 中将每月索引重新索引为每日索引