您可以将现有查询转换为子查询,然后使用窗口功能RANK()
按每天的每日交易对客户进行排名,然后按组对前10位客户进行过滤:
SELECT transactions,customer_id,transaction_date
FROM (
SELECT
t.*,RANK() OVER(PARTITION BY transaction_date ORDER BY transactions DESC) rn
FROM (
SELECT
COUNT(*) as transactions,DATEADD(DAY,DATEDIFF(day,transaction_date)) as transaction_date
FROM InvoiceTable
WHERE transaction_date > {ts '2019-09-01 00:00:00'}
GROUP BY
customer_id,DATEDIFF(DAY,transaction_date))
) t
) t
WHERE rn <= 10
ORDER BY transaction_date,transactions desc
侧面说明:SQL Server在混合聚合和窗口函数方面非常灵活,因此可能也可以正常工作:
SELECT transactions,transaction_date
FROM (
SELECT
COUNT(*) as transactions,transaction_date)) as transaction_date,RANK() OVER(PARTITION BY transaction_date ORDER BY COUNT(*) DESC) rn
FROM InvoiceTable
WHERE transaction_date > {ts '2019-09-01 00:00:00'}
GROUP BY
customer_id,transaction_date))
) t
WHERE rn <= 10
ORDER BY transaction_date,transactions desc
,
您可以使用row_number()
with cte as
(SELECT COUNT(*) as transactions,transaction_date)) as 'transaction_date',FROM InvoiceTable
WHERE transaction_date > {ts '2019-09-01 00:00:00'}
GROUP BY customer_id,transaction_date))
ORDER BY transaction_date
)
select * from
(
select *,row_number() over(partition by transaction_date order by transactions desc) as rn from cte
)A where rn<11
,
要提取日期,请转换为date
。 dateadd()
方法已经过时了十年。
您可以结合使用窗口函数和聚合,因此查询看起来像:
SELECT t.*
FROM (SELECT CONVERT(DATE,transaction_date) as transaction_date,COUNT(*) as transactions,ROW_NUMBER() OVER (PARTITION BY CONVERT(DATE,transaction_date) ORDER BY COUNT(*) DESC) as seqnum
FROM InvoiceTable
WHERE transaction_date > {ts '2019-09-01 00:00:00'}
GROUP BY CONVERT(DATE,transaction_date),customer_id
) t
WHERE seqnum <= 10
ORDER BY transaction_date;
请注意,这总是返回10行(如果每天有10个客户)。如果存在联系,则返回任意绑定的客户,并且返回的客户可能会因查询的不同运行而有所不同。
本文链接:https://www.f2er.com/2978985.html