如何获取SQL Server中每个组/分区的最大行数?

Dav*_*rns 14 sql t-sql sql-server sql-server-2005

我正在使用SQL Server 2005.我有一个付款表,其中包含付款ID,用户ID和时间戳.我想找到每个用户的最新付款.这很容易搜索并找到答案.我还想知道的是,最近的付款是否是用户的第一次付款.

我有以下将为每个用户的付款编号:

SELECT
    p.payment_id,
    p.user_id,
    ROW_NUMBER() OVER (PARTITION BY p.user_id ORDER BY p.payment_date) AS paymentNumber
FROM
    payment p
Run Code Online (Sandbox Code Playgroud)

我没有进行精神飞跃,然后让我选择每个用户最高的paymentNumber.如果我使用MAX(paymentNumber)将上面的内容用作子选择,然后按user_id进行分组,则会丢失我需要的payment_id.但是,如果我还将payment_id添加到group by子句中,那么每次付款我都会返回一行.我敢肯定我忽视了这一点.有帮助吗?

Cha*_*ndu 30

试试这个:

SELECT a.*, CASE WHEN totalPayments>1 THEN 'NO' ELSE 'YES' END IsFirstPayment
  FROM(
                SELECT  p.payment_id,     
                                p.user_id,     
                                ROW_NUMBER() OVER (PARTITION BY p.user_id ORDER BY p.payment_date DESC) AS paymentNumber,
                                SUM(1) OVER (PARTITION BY p.user_id) AS totalPayments
                    FROM payment p 
            ) a
WHERE   paymentNumber = 1       
Run Code Online (Sandbox Code Playgroud)

  • 解释你在"试试这个"代码中所做的事情会有很大的帮助 (2认同)

bti*_*lly 12

再做同样的事情.

SELECT
    p.payment_id,
    p.user_id,
    ROW_NUMBER() OVER (PARTITION BY p.user_id ORDER BY p.payment_date) AS paymentNumber,
    ROW_NUMBER() OVER (PARTITION BY p.user_id ORDER BY p.payment_date DESC) AS reversePaymentNumber,
FROM
    payment p
Run Code Online (Sandbox Code Playgroud)

现在最近的付款有reversePaymentNumber 1,付款数量是paymentNumber.

  • 您的回答帮助我选择了分区中多于 1 行的行组。我对行号和反向行号进行了求和,并选择了总和大于 2 的行。谢谢! (2认同)