Sql 让每个患者';最高帐单

Sql 让每个患者';最高帐单,sql,sql-server-2008,tsql,Sql,Sql Server 2008,Tsql,我有一个表,其中一个ID可以与多个账单关联。我需要做的是找到MAX账单金额、ID和最高(MAX)账单的日期。问题是每个人可能有数千个账单,在任何给定的日期都有数百个账单 我的问题 select patientID, max(amountPaid) as maxPaid from myTable group by patientID 给我所需要的,减去日期。我试图解决这个问题是错误的 select t.patientID, t.maxPaid, myTable.billDate from myT

我有一个表,其中一个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

给出的错误是
无效列名maxpayed
。我尝试不为计算字段提供别名,但SQL Server也不接受myTable.max(amountPaid)。解决这个问题最快的方法是什么?提前谢谢。

根据您的描述,我想您的意思是:

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

根据你的描述,我认为你的意思是:

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

您当前方法的问题是,如果患者有两张金额最大的账单,您将同时获得这两张账单

请尝试以下方法:

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

这将始终为每位患者返回一行,即使患者有两张账单,且两张账单的最大支付金额相同,您当前方法的问题是,如果患者有两张账单的最大金额,您将同时获得这两张账单

;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;
请尝试以下方法:

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

这将始终为每个患者返回一行,即使患者有两张账单,且两张账单的最大支付金额相同,这取决于“修复”的含义。你想做的并不是最好的方法。虽然“快速修复”可能很快,但我不确定它是否是“修复”。好吧,如果知道为什么这种方法不可取,然后指导我找到更好的方法,那就太好了。如果我有我的druthers:)你
myTable
有唯一的键吗?这取决于你所说的“修复”是什么意思。你想做的并不是最好的方法。虽然“快速修复”可能很快,但我不确定它是否是“修复”。好吧,如果知道为什么这种方法不可取,然后指导我找到更好的方法,那就太好了。如果我有我的druthers:)你的
myTable
有唯一的键吗?
;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;