2012-07-19 20 views
1

我有一張表,其中一張ID可以與多張帳單關聯。我需要做的是找到MAX帳單金額,ID和最高(MAX)帳單的日期。問題是可以有成千上萬的人,在任何給定的日期都有數百人。獲取每個患者的最高賬單

我查詢

select patientID, max(amountPaid) as maxPaid 
from myTable 
group by patientID 

給我我需要什麼,減去日期。我試圖解決這個問題是

select t.patientID, t.maxPaid, myTable.billDate 
from myTable 
inner join 
(
select patientid, max(amountPaid) as maxPaid 
from myTable 
group by patientID 
) as t on t.patientID=myTable.patientID and =t.maxPaid=myTable.maxPaid 

給出的錯誤是invalid column name maxPaid。我嘗試不給計算字段一個別名,但SQL Server不會接受myTable.max(amountPaid)。解決這個問題的最快方法是什麼?提前致謝。

+1

這取決於你的意思是「修復」。你試圖做的並不是最好的方法。儘管「快速修復」可能會很快,但我不確定這是否是一個「修復」。 – 2012-07-19 21:25:24

+0

好吧,很高興知道爲什麼這種方式不可取,然後引導我一個更好的方法。如果我有我的druthers :) – wootscootinboogie 2012-07-19 21:26:37

+1

你'myTable'有一個唯一的密鑰? – 2012-07-19 21:26:52

回答

4

與您當前方法的問題是,如果患者有兩項法案的最大數量,你會得到他們兩個。

試試這個:

SELECT 
    patientid, 
    amountPaid AS max_paid, 
    billDate 
FROM 
(
    SELECT 
     patientid, 
     amountPaid, 
     billDate, 
     ROW_NUMBER() OVER (PARTITION BY patientid 
          ORDER BY amountpaid DESC) AS RowNumber 
    FROM myTable 
) T1 
WHERE T1.RowNumber = 1 

這將始終返回每個患者一行即使患者有兩項法案,這兩個具有相同的最大amountpaid

1

根據你的描述,我覺得你的意思是這樣的:

select t1.patientID, t2.maxPaid, t1.billDate 
from myTable t1 
inner join 
(
    select patientid, max(amountPaid) as maxPaid 
    from myTable 
    group by patientID 
) t2 
on t1.patientID=t2.patientID 
and t1.amountPaid=t2.maxPaid 
2
;WITH x AS (SELECT PatientID, BillDate, AmountPaid, 
    rn = ROW_NUMBER() OVER (PARTITION BY PatientID ORDER BY AmountPaid DESC) 
    FROM dbo.myTable 
) 
SELECT PatientID, BillDate, AmountPaid 
FROM x 
WHERE rn = 1;