[英]How to retrieve the Max Row per group when the partition is a DateTime column
[英]How to get the max row number per group/partition in SQL Server?
我正在使用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
我沒有進行精神飛躍,然后讓我選擇每個用戶最高的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
再做同樣的事情。
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
現在最近的付款有reversePaymentNumber 1,付款數量是paymentNumber。
; with cte as (
SELECT
p.payment_id,
p.user_id,
ROW_NUMBER() OVER (PARTITION BY p.user_id ORDER BY p.payment_date desc) AS paymentNumber
FROM
payment p
) select * from cte where paymentNumber = 1
我認為這種方式不太酷
; with maxp as
(
select
p.user_id,
max(p.payment_date) as MaxPaymentDate
from payment p
group by p.userid
),
nump as
(
select
p.payment_id,
p.user_id,
p.payment_date,
ROW_NUMBER() OVER (PARTITION BY p.user_id ORDER BY p.payment_date) AS paymentNumber
FROM payment p
),
a as
(
select
nump.payment_id,
nump.user_id,
nump.paymentNumber
case when maxp.MaxPaymentDate is null then 'Old' else 'New' end as NewState
from nump
left outer join maxp
on nump.user_id=maxp.user_id
and nump.payment_date=maxp.MaxPaymentDate
)
select
*
from a
where NewState='New'
SELECT * FROM (
SELECT ROW_NUMBER() OVER(PARTITION BY OS.ContactId ORDER BY OS.Date ASC) AS FirstRow#,
ROW_NUMBER() OVER(PARTITION BY OS.ContactId ORDER BY OS.Date DESC) AS LastRow#,
OS.Contactid,CONVERT(VARCHAR,OS.Date,106) 'Purchase Month',
OS.ProductId 'MyCII Subscription/Directory', OS.Charges 'Amount(INR)',OS.Date 'RAWDate'
FROM tblOnlineServices OS
WHERE Date IS NOT NULL AND Contactid IN('C000013112','C000010859')
) FirstPurchase
WHERE FirstRow# = 1 OR LastRow# = 1
ORDER BY Contactid, RAWDate
這個怎么樣?
SELECT
p.user_id,
MAX(p.payment_date) as lastPayment,
CASE COUNT(p.payment_id) WHEN 1 THEN 1 ELSE 0 END as isFirstPayment
FROM
payment p
GROUP BY
p.user_id
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.