2017-07-28 61 views
0

我有一個表,看起來像:PostgreSQL的 - 等級超過在0塊上市行1

id  code  date1   date2   block 
-------------------------------------------------- 
20  1234  2017-07-01 2017-07-31 1 
15  1234  2017-06-01 2017-06-30 1 
13  1234  2017-05-01 2017-05-31 0 
11  1234  2017-03-01 2017-03-31 0 
9  1234  2017-02-01 2017-02-28 1 
8  1234  2017-01-01 2017-01-31 0 
7  1234  2016-11-01 2016-11-31 0 
6  1234  2016-10-01 2016-10-31 1 
2  1234  2016-09-01 2016-09-31 1 

我需要根據0和1的,像塊進行排名的行:

id  code  date1   date2   block  desired_rank 
------------------------------------------------------------------- 
20  1234  2017-07-01 2017-07-31 1   1 
15  1234  2017-06-01 2017-06-30 1   1 
13  1234  2017-05-01 2017-05-31 0   2 
11  1234  2017-03-01 2017-03-31 0   2 
9  1234  2017-02-01 2017-02-28 1   3 
8  1234  2017-01-01 2017-01-31 0   4 
7  1234  2016-11-01 2016-11-31 0   4 
6  1234  2016-10-01 2016-10-31 1   5 
2  1234  2016-09-01 2016-09-31 1   5 

我試着使用秩()和DENSE_RANK(),但結果我最終是:

id  code  date1   date2   block  dense_rank() 
------------------------------------------------------------------- 
20  1234  2017-07-01 2017-07-31 1   1 
15  1234  2017-06-01 2017-06-30 1   2 
13  1234  2017-05-01 2017-05-31 0   1 
11  1234  2017-03-01 2017-03-31 0   2 
9  1234  2017-02-01 2017-02-28 1   3 
8  1234  2017-01-01 2017-01-31 0   3 
7  1234  2016-11-01 2016-11-31 0   4 
6  1234  2016-10-01 2016-10-31 1   4 
2  1234  2016-09-01 2016-09-31 1   5 

在最後一個表中,排名並不關心行,它只是將所有1和0作爲一個單位,並設置從第一個1和第0個開始的遞增計數。 我的查詢是這樣的:

CREATE TEMP TABLE data (id integer,code text, date1 date, date2 date, block integer); 

INSERT INTO data VALUES 
(20,'1234', '2017-07-01','2017-07-31',1), 
(15,'1234', '2017-06-01','2017-06-30',1), 
(13,'1234', '2017-05-01','2017-05-31',0), 
(11,'1234', '2017-03-01','2017-03-31',0), 
(9, '1234', '2017-02-01','2017-02-28',1), 
(8, '1234', '2017-01-01','2017-01-31',0), 
(7, '1234', '2016-11-01','2016-11-30',0), 
(6, '1234', '2016-10-01','2016-10-31',1), 
(2, '1234', '2016-09-01','2016-09-30',1); 

SELECT *,dense_rank() OVER (PARTITION BY code,block ORDER BY date2 DESC) 
FROM data 
ORDER BY date2 DESC; 

順便說一下,數據庫是在postgreSQL。

我希望有一個變通方法...謝謝:)

編輯:注意0和1的塊是不相等的。

+0

試試這個,從分區中刪除塊和date2的,塊使用順序。 –

回答

1

有沒有辦法得到這個結果使用窗口功能:

SELECT *, 
    Sum(flag) -- now sum the 0/1 to create the "rank" 
    Over (PARTITION BY code 
     ORDER BY date2 DESC) 
FROM 
(
    SELECT *, 
     CASE 
     WHEN Lag(block) -- check if this is the 1st row of a new block 
       Over (PARTITION BY code 
        ORDER BY date2 DESC) = block 
     THEN 0 
     ELSE 1 
     END AS flag 
    FROM DATA 
) AS dt 
+0

哇...它的工作!謝謝,我是新的窗口功能,但它似乎是最好的解決方案。謝謝。 – Dan