如何选择SQL输出的最大值

时间:2013-12-31 17:41:35

标签: sql sql-server sql-server-2008

SQL查询语法问题。我有一个查询返回大约150,000行记录。在此查询中,您可以看到ROW_NUMBER() OVER PARTITION。在select * from cte,我需要为每个Pat_id选择ROW_NUMBER()的最高值。

如果一个pat_id的RowNumber为150。我只需要那一行记录。我很难缩小到一个记录。我请专家分享您的语法来帮助我。

with cte
as (
    select  pat.pat_id,
            pat.fname as [FirstName],
            pat.mname as [MiddleName],
            pat.lname as [LastName],
            [DOB] =Convert(VARCHAR(12),pat.birth_date,101),
            csc.name as [AccountType],
            [Plan Name] = CASE when (isnull(org.name,'')='') then 'CASH' else org.name end
            ,cprx_disp.disp_days_supply
            ,cprx_disp.dispense_date
            ,(cprx_disp.dispense_date + cprx_disp.disp_days_supply) as [DateDue]
            ,ROW_NUMBER() over(PARTITION BY  pat.pat_id ORDER BY cprx_disp.dispense_date) as [RowNumber]

    From    cppat pat (nolock)
            left outer join cppat_ins patins(NoLock) ON patins.pat_id = pat.pat_id
            left outer join csorg org on org.org_id = patins.org_id
            inner join csct_code csc on pat.pat_type_cn = csc.code_num
            join cprx on cprx.pat_id = pat.pat_id
            join cprx_disp (nolock) on cprx.last_rxdisp_id =  cprx_disp.rxdisp_id

    where   csc.ct_id = 163
            and csc.code_num in (1033,1010,1011,1012,1016,1017,1016,1018)
            and patins.status_cn = 1
            and patins.priority = 1

    --   Commented. 
    -- and pat.pat_id = 2561
)
select  cte.[FirstName],
        cte.[MiddleName],
        cte.[LastName],
        cte.[DOB],  
        cte.[AccountType],
        cte.[Plan Name],
        Cte.DateDue

from cte

1 个答案:

答案 0 :(得分:1)

好吧,你实际上并没有在输出中使用RowNumber,所以我只是将其反转然后返回等于1的那些:

with cte
as (
    select  pat.pat_id,
            pat.fname as [FirstName],
            pat.mname as [MiddleName],
            pat.lname as [LastName],
            [DOB] =Convert(VARCHAR(12),pat.birth_date,101),  
            csc.name as [AccountType],
            [Plan Name] = CASE when (isnull(org.name,'')='') then 'CASH' else org.name end
            ,cprx_disp.disp_days_supply
            ,cprx_disp.dispense_date
            ,(cprx_disp.dispense_date + cprx_disp.disp_days_supply) as [DateDue]        
            ,ROW_NUMBER() over(PARTITION BY  pat.pat_id ORDER BY cprx_disp.dispense_date DESC) as [RowNumber]   

    from    cppat pat (nolock) 
            left outer join cppat_ins patins(NoLock) on patins.pat_id = pat.pat_id
            left outer join csorg org on org.org_id = patins.org_id
            inner join csct_code csc on pat.pat_type_cn = csc.code_num
            join cprx on cprx.pat_id = pat.pat_id 
            join cprx_disp (nolock) on cprx.last_rxdisp_id =  cprx_disp.rxdisp_id     
    where   csc.ct_id = 163
            and csc.code_num in (1033,1010,1011,1012,1016,1017,1016,1018)
            and patins.status_cn = 1
            and patins.priority = 1

    --   Commented. 
    -- and pat.pat_id = 2561
)
select  cte.[FirstName],
        cte.[MiddleName],
        cte.[LastName],
        cte.[DOB],  
        cte.[AccountType],
        cte.[Plan Name],
        cte.DateDue

from    cte
WHERE   RowNumber = 1;