从每日数据中选择一个月内计数大于 4 的数据
Selecting data with counts more than 4 in a month from a daily data
我正在尝试从包含每日交易的 table 中计算在过去 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
我的问题是:这个查询会提取正确的数据吗?如果是这样,这是最有效的编写方式还是我可以提高此查询的性能?
仅获取您可以使用的商家列表,用于过滤不同数量 payement_id 和月份
的聚合值的结果
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
对于你更新的问题只是一个建议
您可以加入 return 一年中每个月交易量超过 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
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 月,当 运行 在 2018 年 10 月 10 日查询时。你也不想只查看 2016 年 10 月的最后二十天。我们希望查看完整的 2016 年 10 月到完整的 2018 年 9 月。
接下来我们要确保商家每月至少有四笔交易。换句话说:他们每个月都有交易,而且每个月的最低交易笔数是四笔。我们可以使用 window 函数对每月交易 运行 进行检查。
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;
或
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;
我正在尝试从包含每日交易的 table 中计算在过去 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
我的问题是:这个查询会提取正确的数据吗?如果是这样,这是最有效的编写方式还是我可以提高此查询的性能?
仅获取您可以使用的商家列表,用于过滤不同数量 payement_id 和月份
的聚合值的结果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
对于你更新的问题只是一个建议
您可以加入 return 一年中每个月交易量超过 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
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 月,当 运行 在 2018 年 10 月 10 日查询时。你也不想只查看 2016 年 10 月的最后二十天。我们希望查看完整的 2016 年 10 月到完整的 2018 年 9 月。
接下来我们要确保商家每月至少有四笔交易。换句话说:他们每个月都有交易,而且每个月的最低交易笔数是四笔。我们可以使用 window 函数对每月交易 运行 进行检查。
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;
或
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;