0

如何解決這個問題,在SQL Server檢查基於SQL Server中列條件

Table: emp 

Pid | Address   | City | datetime     | Edate  | level 
1 | Homeless   | Chen | 2014-11-13 09:32:14.000 |2013-02-10 |3 
1 | 3913 W. Strong | Chen | 2011-03-044 19:04:10.000 |2014-02-04 |7 
1 | 1100 W MALLON  | Chen | 2014-11-13 09:32:14.000 |2013-02-10 |5 
2 | 610 W GARLAND #3 | Hyd | 2013-11-13 09:32:14.000 |2014-04-02 |4 
3 | banvanu   | chen | 2015-03-044 06:04:10.000 |2015-05-06 |6 
3 | naneku   | chen | 2015-03-044 06:04:10.000 |2015-06-09 |4 

基於上面的表格我想輸出類似下面

Pid | Address   | City | datetime     | Edate  | level 
1 | 1100 W MALLON  | Chen | 2014-11-13 09:32:14.000 |2013-02-10 |5 
2 | 610 W GARLAND #3 | Hyd | 2013-11-13 09:32:14.000 |2014-04-02 |4 
3 | naneku   | chen | 2015-03-044 06:04:10.000 |2015-06-09 |4 

我們需要從獲取地址,城市基於以下條件的同一表

我們得到輸出的條件很少:第一級根據pid檢查max(datetime)如果max(datetime)的值對於相同的pid相同,則相同的pid需要檢查max(edat E)如果我們再相同值,那麼我們需要檢查最大(級)particilar患者檢索地址,城市對於PID

我試着像下面

select * from (select *,row_number()over(partition by id ,order by datetime,edate,level)as rno 
       from emp) 
where rno=1 

,但上面的查詢沒有給出預期導致 請告訴我如何寫查詢才達到在SQL Server這個任務

+1

如果您想要最大日期時間,最大edate和最大級別,它應該不是按降序排序 - 「ROW_NUMBER()OVER(分區由PID日期時間DESC,eDate DESC,級別DESC)' – GarethD

+0

當您爲問題添加標籤時,請不要爲每個版本使用標籤。只需使用通用的sql-server,如果適用,則可以使用特定版本的標籤。 – jpw

回答

1

你需要在窗口函數中使用降序排列:

select [Pid], [Address], [City], [datetime], [Edate], [level] 
from (
    select * 
     , rn= row_number() over (partition by [pid] 
           order by [datetime] desc, 
             [edate] desc, 
             [level] desc 
           ) 
    from emp 
) a 
where rn = 1; 
+0

謝謝你的工作。 – balu

+1

@srinivasa如果這解決了你的問題,那麼你應該考慮[接受它作爲一個答案](http://meta.stackexchange.com/q/5234/179361) – GarethD

0

試試這個:

WITH Empgroup AS (
    SELECT 
     Pid 
     , [Address] 
     , City 
     , [DateTime] 
     , EDate 
     , [Level] 
     , ROW_NUMBER() OVER (PARTITION BY Pid ORDER BY [DateTime] DESC, EDate DESC, [Level] DESC) AS RN 
    FROM 
     Emp 
) 
SELECT 
    Pid 
    , [Address] 
    , City 
    , [DateTime] 
    , EDate 
    , [Level] 
FROM 
    Empgroup 
WHERE 
    RN = 1 

功能區別在於ROW_NUMBER()的排序。然而,我也選擇使用通用表達式來使查詢更清晰。

+0

你認爲使用一個公用表表達式的方式查詢效率更高?我主觀地認識到,普通表格表達式可能更易於閱讀,但它對性能絕對沒有影響,它純粹是一種美學上的改變。 – GarethD

+0

@GarethD你是對的,修改過。 –

+0

謝謝你的工作。 – balu