Sql 从每日数据中选择每月计数超过4的数据

Sql 从每日数据中选择每月计数超过4的数据,sql,snowflake-cloud-data-platform,Sql,Snowflake Cloud Data Platform,我试图从一个包含商户每日交易的表格中统计过去2年中每月至少进行4次交易的商户的每月数量(以及他们处理的交易总额) 我的质询如下: SELECT trx.month, COUNT(trx.merchants), SUM(trx.amount) FROM ( SELECT DATE_TRUNC('month', transactions.payment_date) AS month, merchants, COUNT(DISTINCT payment_id) AS vol

我试图从一个包含商户每日交易的表格中统计过去2年中每月至少进行4次交易的商户的每月数量(以及他们处理的交易总额)

我的质询如下:

SELECT trx.month, COUNT(trx.merchants), SUM(trx.amount)
FROM
(
  SELECT
    DATE_TRUNC('month', transactions.payment_date) AS month,
    merchants,
    COUNT(DISTINCT payment_id) AS volume,
    SUM(transactions.payment_amount) AS amount
  FROM transactions
  WHERE transactions.date >= NOW() - INTERVAL '2 years'
  GROUP BY 1, 2
) AS trx
WHERE trx.volume >= 4

我的问题是:这个查询会得到正确的数据吗?如果是这样的话,这是最有效的编写方法还是我可以改进此查询的性能?

对于“仅获取商户列表”,您可以使用该列表筛选不同付款编号和月份的聚合值的结果

SELECT merchants
FROM transactions
WHERE transactions.date >= NOW() - INTERVAL '2 years'
GROUP BY merchants
having count(distinct DATE_TRUNC('month', transactions.payment_date))  =24
  and COUNT(DISTINCT payment_id) >= 4
对你来说,更新的问题只是一个建议

您可以加入一个查询,该查询在两年内每个月返回超过4个卷的marchant,并使用have直接在子查询中过滤aggreated的结果

    SELECT trx.month, COUNT(trx.merchants), SUM(trx.amount)

    FROM (

        SELECT DATE_TRUNC('month', transactions.payment_date) AS month
            , merchants
            , COUNT(DISTINCT payment_id) AS volume
            , SUM(transactions.payment_amount) AS amount
        FROM transactions
        INNER JOIN (
         SELECT merchants
            FROM transactions
            WHERE transactions.date >= NOW() - INTERVAL '2 years'
            GROUP BY merchants
            having count(distinct DATE_TRUNC('month', transactions.payment_date))  =24
            and COUNT(DISTINCT payment_id) >= 4
        ) A on A.merchant = transactions.merchant
        WHERE transactions.date >= NOW() - INTERVAL '2 years'

        GROUP BY 1, 2
        HAVING volume >= 4
    ) AS trx

首先,我们必须考虑时间范围。你说在过去的24个月中,你希望每月至少有四笔交易。但在2018年10月10日运行查询时,您当然不需要在2018年10月这样做。你也不想只看2016年10月的最后二十天。我们希望看到2016年10月至2018年9月的完整数据

接下来,我们要确保商户每月至少有四笔交易。换句话说:他们每个月都有交易,每个月的最低交易数量是4笔。我们可以使用窗口函数来运行每月事务来检查这一点

select merchants, month, volume, amount
from
(
  select
    merchants,
    date_trunc('month', payment_date) as month, 
    count(distinct payment_id) as volume,
    sum(payment_amount) as amount,
    count(*) over (partition by merchants) number_of_months,
    min(count(distinct payment_id)) over (partition by merchants) min_volume
  from transactions
  where date between date_trunc('month', current_date) - interval '24 months'
                 and date_trunc('month', current_date) - interval '1 days'
  group by merchants, date_trunc('month', payment_date)
) monthly
where number_of_months = 24
  and min_volume >= 4
order by merchants, month;
这将提供满足要求的商户列表及其月度数据。如果您想要的是商家的数量,则进行聚合。例如

select count(distinct merchants), sum(amount) as total
from (...) monthly
where number_of_months = 24 and min_volume >= 4;


查找
分组依据
拥有
中的
处理单个记录,而
have
则基于摘要应用过滤器。能否添加表结构和一些示例数据?顺便说一句,在我看来,这个查询不会很好地工作。如果没有额外的信息,我无法回答更好的…该表包含日期、商户id、付款id、金额、货币代码(以及大量其他内容)@GuyL-你能分享一下为什么你第一眼就认为它行不通吗?干杯你用的是哪种数据库管理系统?@jarlh snowflakes但这不会让我知道每月的商户数量,是吗?如果可能的话,我想按月提取商户。您的问题告诉我“我正在尝试提取过去两年每月至少进行4次交易的商户列表(以及他们处理的交易总额)。”。。答案重新列出了这个清单。。我只能读你的问题。。至于这件事,我的错——让我重述一下这个问题。我需要统计每月交易超过4笔的商户数量。你知道这是否可能吗?@KSoenandar。。答案更新的希望是您所期待的。您的
拥有
条款只能确保两年内至少有四笔交易,而不是每月。
select month, count(distinct merchants), sum(amount) as total
from (...) monthly
where number_of_months = 24 and min_volume >= 4
group by month
order by month;