2014-09-30 205 views
0

我有以下含關於每個組是如何解決問題的數據表:重新排序

PROB | GROUP | REPNO | STATUS 
-----+---------+-------+------- 
1 | Juniors | 0 | 
1 | Seniors | 1 | 
1 | Juniors | 2 | 
1 | Experts | 3 | SOLVED 
2 | Juniors | 0 | 
2 | Seniors | 1 | SOLVED 

柱PROB定義了基團中解決問題,列組定義組正在研究這一概率其中,柱REPNO定義解決重複的次數(重複嘗試直到最終解決,0表示首先嚐試,不重複),最後一列STATUS定義是否在該特定嘗試中解決了任務。在這裏,我可以通過所有羣組(SELECT ... GROUP BY repno)在每次重複中有效地解決工作問題。

但我想說明probs是如何有效地解決每個特定的組(每組自己的重複順序分佈)。例如,PROB 1被小組試驗了2次,並且一次被老年人組解決,最終在小組專家的第一次嘗試中得到解決。

所以我需要重複的重新計算對於每個特定組:

PROB | GROUP | REPNO | REPNO_J | REPNO_S | REPNO_E | STATUS 
-----+---------+-------+---------+---------+---------+------- 
1 | Juniors | 0 |  0 |   |   | 
1 | Seniors | 1 |   |  0 |   |   
1 | Juniors | 2 |  1 |   |   |   
1 | Experts | 3 |   |   |  0 | SOLVED <-- experts solved in first try 
2 | Juniors | 0 |  0 |   |   | 
2 | Seniors | 1 |   |  0 |   | SOLVED <-- seniors solved in first try 

如何讓這個重新計算?

+0

它是固定的,你有** 3個**組或將要在組號碼各不相同情況呢? – 2014-09-30 14:53:31

+0

組數不會有所不同。 – sbrbot 2014-09-30 18:43:53

+0

是否有任何公佈的答案可供您使用,或者您是否有其他想法? – 2014-09-30 18:49:21

回答

1

使用RANK()SQL FIDDLE

select 
    PROB, 
    GROUP1, 
    REPNO, 
    DECODE(GROUP1,'Juniors', rank() over (partition by prob, group1 order by repno) - 1) as REPNO_J, 
    DECODE(GROUP1,'Seniors', rank() over (partition by prob, group1 order by repno) - 1) as REPNO_S, 
    DECODE(GROUP1,'Experts', rank() over (partition by prob, group1 order by repno) - 1) as REPNO_E, 
    STATUS 
from mytable 
order by prob,repno 
+0

謝謝@Jaugar Chang,這是非常優雅的解決方案。更重要的是,你在SQLfiddle中提供了一個例子,你是唯一的例子。 – sbrbot 2014-09-30 19:17:24

0

可以使用CASE語句

SELECT "PROB", 
     "GROUP", 
     "REPNO", 
     (CASE WHEN "GROUP" = 'Juniors' THEN REPNO ELSE NULL END) as REPNO_J, 
     (CASE WHEN "GROUP" = 'Seniors' THEN REPNO ELSE NULL END) as REPNO_S, 
     (CASE WHEN "GROUP" = 'Experts' THEN REPNO ELSE NULL END) as REPNO_E 
FROM Table1 
+0

當需要檢查的條件過多時,「CASE」不可行。更好地使用'ANALYTIC'函數來處理每個'group'中的順序,如'PARTITION BY'子句中提到的那樣。 – 2014-09-30 15:37:19

+0

@LalitKumarB,你可以用ANALYTIC函數詳細說明或給出解決方案 – radar 2014-09-30 18:24:07

+0

看看Thorsten的答案。另外,你會寫多少個CASE條件? – 2014-09-30 18:37:17

1

使用ROW_NUMBER窗函數來獲得每組人數:

select 
    prob, 
    "GROUP", 
    repno, 
    case when "GROUP" = 'Juniors' then try end as repno_j, 
    case when "GROUP" = 'Seniors' then try end as repno_s, 
    case when "GROUP" = 'Experts' then try end as repno_e, 
    status 
from 
(
    select 
    prob, "GROUP", repno, status, 
    row_number() over(partition by prob, "GROUP" order by repno) - 1 as try 
    from mytable 
) 
order by prob, repno; 

順便說一句:這不是一個好主意,名稱的列組。這是SQL中的保留字。因此,您必須使用引號並在查詢中使用該名稱時考慮大寫/小寫。

+0

更好的解決方案。 'ANALYTIC'負責處理每個組中的順序,如'PARTITION' BY子句中所述。 – 2014-09-30 15:38:16

+0

此解決方案正常工作。 @Lalit Kumar B,你已經在這裏給出了三條評論推薦ANALYTIC,請給我們你的解決方案,不僅僅是評論。我們希望看到它。 – sbrbot 2014-09-30 19:03:11

+0

@sbrbot,'我們希望看到它'你說** **我是誰?你問了這個問題,人們已經迴應。我不得不說的是技術上的回答。所以,我剛纔就這個答案和我的意見一起評論了爲什麼分析更好。我希望你得到你的答案,我的意見會幫助你理解**爲什麼這是更好的解決方案。你在哪裏看到三條評論?看到你作爲提問者的講話語氣真是令人驚訝。 – 2014-09-30 19:08:32