2016-03-16 29 views
0

我有五列的表格:iduser_codecreated_atA,和Bstartid僅僅是一個鍵,user_code識別與該行相關聯的用戶,created_at是一個時間戳,AB,並start可以獨立取值0或1。依賴於前面的行PostgreSQL的列值

我什麼是運行查詢,其將所述列AsBs,根據created_at,然後給定行的As值哪些訂單原始表以升序等於先前行的具有相同user_code是有A = 1自從上次start = 1(數量,同樣的事情BsB)。

樣品輸入:

id | user_code | created_at | A | B | start 
--------------------------------------------- 
00 |  1  |  t0  | 1 | 0 | 1 
01 |  1  |  t1  | 0 | 0 | 1 
02 |  2  |  t1  | 0 | 0 | 1 
03 |  1  |  t2  | 1 | 0 | 0 
04 |  2  |  t2  | 0 | 1 | 0 
05 |  2  |  t3  | 0 | 1 | 0 
06 |  1  |  t4  | 1 | 1 | 0 
07 |  1  |  t5  | 0 | 1 | 1 

輸出示例:

id | user_code | created_at | A | B | start | As | Bs 
------------------------------------------------------- 
00 |  1  |  t0  | 1 | 0 | 1 | 01 | 00 
01 |  1  |  t1  | 0 | 0 | 1 | 00 | 00 
02 |  2  |  t1  | 0 | 0 | 1 | 00 | 00 
03 |  1  |  t2  | 1 | 0 | 0 | 01 | 00 
04 |  2  |  t2  | 0 | 1 | 0 | 00 | 01 
05 |  2  |  t3  | 0 | 1 | 0 | 00 | 02 
06 |  1  |  t4  | 1 | 1 | 0 | 02 | 01 
07 |  1  |  t5  | 0 | 1 | 1 | 00 | 01 
08 |  2  |  t6  | 1 | 0 | 1 | 01 | 00 

回答

3

您可以使用COUNTOVER條款:

SELECT "id", "user_code", "created_at", "A", "B", 
     COUNT(CASE WHEN "A" <> 0 THEN 1 END) 
      OVER (PARTITION BY "user_code" ORDER BY "id") AS As, 
     COUNT(CASE WHEN "B" <> 0 THEN 1 END) 
      OVER (PARTITION BY "user_code" ORDER BY "id") AS Bs 
FROM mytable 

Demo here

+0

這是我解釋的問題的一個很好的解決方案!但是我忘了添加一個很重要的細節,這使得這個解決方案不太合適:x我編輯過來添加它。 –