TSQL-每天返回前10名客户

SQL Server 2014

我有一个包含以下内容的表:-

[id ] [transaction_date]                  [customer_id]
 1     2019-11-18 00:00:00.000              1234
 2     2019-11-18 00:00:00.000              1234
 3     2019-11-18 00:00:00.000              5687
 4     2019-11-19 00:00:00.000              9999
 5     2019-11-19 00:00:00.000              8888
...

一个客户一天可以进行多笔交易。

自2019年9月1日以来,我需要每天返回前10名客户(基于交易数)。例如,客户1234在18/11/2019进行了2笔交易。

我将如何处理?

我从初始查询开始:-

SELECT COUNT(*) as transactions,customer_id,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))
ORDER BY transaction_date

但此后没有取得更多进展。

wwwwwssssss 回答:TSQL-每天返回前10名客户

您可以将现有查询转换为子查询,然后使用窗口功能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
,

要提取日期,请转换为datedateadd()方法已经过时了十年。

您可以结合使用窗口函数和聚合,因此查询看起来像:

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

大家都在问