2013-07-31 42 views
0

我正在嘗試爲每個用戶找到最後一個條目位置。我還需要忽略餘額爲零的任何行。查找特定用戶標識的最後一個條目

樣品表:

ID location user balance 
    -- -------- ---- ------- 
    1 GLA  A 10.21 
    2 GLA  A 0.00 
    3 GLA  B 45.68 
    4 GLA  B 12.56 
    5 EDI  C 1.23 
    6 EDI  D 5.48 
    7 EDI  D 0.00 
    8 LON  E 78.59 
    9 MAN  F 0.00 
    10 MAN  F 12.98 
    11 MAN  G 56.45 
    12 MAN  G 89.25 
    13 MAN  H 0.00 
    14 BIR  I 0.00 
    15 BIR  I 32.87 

結果要求:

ID location user balance 
    -- -------- ---- ------- 
    4 GLA  B 12.56 
    5 EDI  C 1.23 
    8 LON  E 78.59 
    10 MAN  F 12.98 
    12 MAN  G 89.25 
    15 BIR  I 32.87 

我被留下來支付一個同事誰是休病假和unfotunately我的SQL知識是比較有限的。

我一直在研究使用MAX和PARTITION BY,但目前爲止沒有運氣。這是針對SQL Server 2005數據庫的。

任何援助與此將不勝感激。我將添加我所做的任何進展。

很多謝謝。

+2

*'我還需要忽略任何平衡爲零的行'* - 您的意思是您需要忽略** last **'balance'爲零的用戶? –

回答

5

你應該能夠使用row_number()得到結果:

select id, location, [user], balance 
from 
(
    select id, location, [user], balance, 
    row_number() over(partition by location, [user] 
         order by id desc) seq 
    from yourtable 
) d 
where seq = 1 
    and balance <> 0 
order by id; 

SQL Fiddle with Demo

+0

我想你會想在子選擇內部的'平衡<> 0「,以便你在你的小提琴中不會失去'A'用戶。 –

+0

@AdamWenger這是我最初的想法,但基於期望的結果,這將是錯誤的。它看起來像邏輯返回用戶/位置的最大ID,只要餘額不爲零。如果將其放入子查詢中,用戶A將返回,這不是上面所期望的OP。 – Taryn

+0

@AdamWenger號這個查詢是正確的,'balance <> 0'應該在外部查詢中。根據OP,用戶'A','D'和'H'應該被排除,因爲他們的** last **餘額爲零。 +1 –

5
Select 
     A.ID , 
     A.location, 
     A.[user] , 
     A.balance from TABLE1 A 
    inner join (
       Select Max(Id) AS Id from TABLE1 
       group by location,[user] 
       ) B 
     on A.ID=B.ID 
     WHERE A.Balance>0 

Sql Fiddle Demo

+0

OP想按位置**和用戶**分組。你也忘了排除零餘額 –

+0

@JoseRuiSantos現在沒關係 –

+0

yes現在看起來像好的+1 –

0

使用Row_Number()功能:

SELECT id, 
    location, 
    user, 
    balance 
FROM (SELECT ROW_NUMBER() 
       OVER (
       PARTITION BY user 
       ORDER BY id DESC) AS rowid, 
      * 
    FROM tableA) AS data 
WHERE (rowid = 1) 
    AND (balance > 0) 
相關問題