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 中将每月索引重新索引为每日索引

将日期索引 dtype 从对象更改为日期时间以进行每月可视化

oracle索引问题,删除再重建索引与索引分析

使用 Pandas 将每日数据重新采样为每月(日期格式)