我有一个SQL,它给出以下结果。
!(https://imgur.com/a/cQjceR2)
我想按第一列“ eventid”过滤结果,其中仅显示特定月份的前三个结果。
例如,在图像中,第12个月有四个事件ID,在新结果中将只有三个。
以下是sql。
select eventid, qtysold, pricepaid, qtysold*pricepaid as total_sales_by_tickets,
"date_part"('month'::text, saletime) AS month_id
from public.sales
group by eventid, qtysold, pricepaid, total_sales_by_tickets, month_id
ORDER BY qtysold desc, "date_part"('month'::text, saletime desc;
答案 0 :(得分:1)
您可以使用row_number()
:
select eventid, qtysold, pricepaid, qtysold*pricepaid as
total_sales_by_tickets,
date_trunc('month'::text, saletime) AS month_id
from (select s.*,
row_number() over (partition by eventid, date_trunc('month'::text, saletime) order by saletime) as seqnum
from public.sales s
) s
where seqnum <= 3
order by qtysold desc, date_trunc('month'::text, saletime) desc;
我不确定您为什么使用"date_part"()
。我更喜欢date_trunc()
选择日期的月份部分。
此外,我认为没有必要进行汇总。您当然没有使用任何聚合函数,因此group by
似乎是多余的。