我正在使用SQL Server2005。我有一个带有付款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
我没有进行一次精神上的飞跃,然后让我为每个用户选择了最高的paymentNumber。如果我通过使用MAX(paymentNumber)然后将以上内容用作子选择,然后按user_id分组,则会丢失我需要的payment_id。但是,如果我也将payment_id添加到group by子句中,则我将返回每笔付款的一行。我敢肯定,我忽略了显而易见的事情。有什么帮助吗?
试试这个:
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