【问题标题】:Standard deviation of a set of dates一组日期的标准差
【发布时间】:2017-04-23 23:48:52
【问题描述】:

我有一个包含id | client_id | datetime 列的交易表,我计算了交易之间的平均天数,以了解每个客户进行这些交易的频率:

SELECT *, ((date_last_transaction - date_first_transaction)/total_transactions) AS frequency 
FROM (
    SELECT client_id, COUNT(id) AS total_transactions, MIN(datetime) AS date_first_transaction, MAX(datetime) AS date_last_transaction
    FROM transactions
    GROUP BY client_id
) AS t;

使用 postgresql 计算一组日期中的标准偏差(以天为单位)的现有方法是什么?最好只有一个查询,如果可能的话:-)

【问题讨论】:

标签: sql postgresql statistics


【解决方案1】:

我找到了这种方式:

SELECT extract(day from date_trunc('day', (
        CASE WHEN COUNT(*) <= 1 THEN 
            0 
        ELSE 
            SUM(time_since_last_invoice)/(COUNT(*)-1) 
        END
    ) * '1 day'::interval)) AS days_between_purchases, 
    extract(day from date_trunc('day', (
        CASE WHEN COUNT(*) <= 2 THEN 
            0 
        ELSE 
            STDDEV(time_since_last_invoice) 
        END
    ) * '1 day'::interval)) AS range_of_days
FROM (
    SELECT client_id, datetime, COALESCE(datetime - lag(datetime) 
              OVER (PARTITION BY client_id ORDER BY client_id, datetime
                 ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING
              ), 0
           ) AS time_since_last_invoice
    FROM my_table 
    GROUP BY client_id, datetime
    ORDER BY client_id, datetime
)

说明: 此查询按客户和日期分组,然后按client_id 计算每对交易日期 (datetime) 之间的差异,并返回包含这些结果的表。在此之后,外部查询处理该表并计算大于 0 的差异之间的平均时间(每组中的第一个值被排除,因为是第一个事务,因此间隔为 0)。 当同一客户存在 2 个或多个交易日期时计算标准偏差,以避免除以零错误。 所有差异均以 PostgreSQL 间隔格式返回。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-18
    • 2014-02-27
    • 1970-01-01
    • 2012-07-30
    • 1970-01-01
    • 2023-03-08
    • 2017-04-07
    相关资源
    最近更新 更多