2011-10-21 78 views
2

你們能否給我看看以下情況的查詢? 我在表access_log這些列:在PostgreSQL中選擇每個客戶的最後兩條記錄

customer_id | service_name | accessed_time 

一位顧客可能會訪問該服務的任何數量的時間。但是我只需要列出每個customer_id的最後兩條記錄。

+0

您是否正在尋找最後兩個(即兩個最最近)爲每個'customer_id',無論'service_name'或是'service_name'涉及莫名其妙? –

+0

ya ..每個customer_id的兩個最近記錄,沒關係service_name – Pavunkumar

回答

5

東西沿着這些路線應該工作:

select * from access_log a1 
where 2 > (select count(*) from access_log a2 
      where a1.customer_id = a2.customer_id 
      and a1.accessed_time < a2.accessed_time) 

這寫着:獲得其中存在0或1,其他的訪問日誌爲同一客戶與後來的「accessed_time」的所有日誌。確保在相關列上有適當的索引。

+0

WHERE子句的良好用法。從來沒有想過任何類似的東西。 – bos

+0

@bos:謝謝。儘管如此,我認爲*畝太短*的解決方案可能會超過我的 –

+0

測試它們並查看。 – Kuberchaun

11

Window functions救援(再次):

select customer_id, service_name, accessed_time 
from (
    select customer_id, service_name, accessed_time, 
      rank() over (partition by customer_id order by accessed_time desc) as rank 
    from access_log 
) dt 
where dt.rank <= 2 

這假定 「過去兩年」 是指 「兩個最近期的」。取決於您想如何處理重複項,row_number窗口函數可能更合適。

這樣的假設數據(對不起,我不覺得有想象力今晚):

=> select * from access_log order by customer_id, accessed_time; 
customer_id | service_name | accessed_time  
-------------+--------------+--------------------- 
      1 | one   | 2011-01-01 00:00:00 
      1 | two   | 2011-01-02 00:00:00 
      1 | three  | 2011-01-03 00:00:00 
      2 | two   | 2011-01-02 00:00:00 
      2 | one   | 2011-04-01 00:00:00 
      2 | three  | 2011-05-03 00:00:00 

上面的查詢率:

customer_id | service_name | accessed_time  
-------------+--------------+--------------------- 
      1 | three  | 2011-01-03 00:00:00 
      1 | two   | 2011-01-02 00:00:00 
      2 | three  | 2011-05-03 00:00:00 
      2 | one   | 2011-04-01 00:00:00 
+0

不錯!可能,您需要通過'customer_id,service_name'進行分區。 OP表達他們問題的方式,看起來這個統計數據應該是以每個客戶和每個服務爲基礎的......? –

+0

@Lukas:OP會說「每個'customer_id'只有最後兩條記錄」,所以我不認爲'service_name'進入它,除了要顯示的東西。我會看看我能否得到澄清。 –

+0

嗯......我被* *中的「*可能訪問過服務*」弄糊塗了 –

相關問題