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)
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.