2015-10-14 89 views
0

(我是很新的數據庫編程,請原諒一個也許是原始的問題。) 我有一個MySQL表:如何計算價值組合的累計發生

id value1 value2 
---------------- 
1 1  A 
2 1  B 
3 2  A 
4 3  A 
5 3  A 
6 3  B 
7 3  A 

我想創造另一個值OCCURRENCE等於表中直到現在在表中找到VALUE1 VALUE2的特定組合的次數。定義「到現在」的順序依據id專欄:

id value1 value2 occurrence 
--------------------------- 
1 1  A  1 
2 1  B  1 
3 2  A  1 
4 3  A  1 
5 3  A  2 
6 3  B  1 
7 3  A  3 

我該怎麼辦呢?

+0

此表沒有PRIMARY KEY,這可能會證明問題進一步在路上......只是說' – Strawberry

+0

@Strawberry:你說得對。實際的表具有它。我試圖保持最低限度的例子。不過,我現在意識到,那麼訂單是未定義的,所以我添加了id列。 – texnic

回答

0

這裏有一種方法,這種方法雖然沒有規模特別好......

DROP TABLE IF EXISTS my_table; 

CREATE TABLE my_table 
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY 
,value1 INT NOT NULL 
,value2 CHAR(1) NOT NULL 
); 

INSERT INTO my_table VALUES 
(1,1,'A'), 
(2,1,'B'), 
(3,2,'A'), 
(4,3,'A'), 
(5,3,'A'), 
(6,3,'B'), 
(7,3,'A'); 

SELECT x.* 
    , COUNT(y.id) rt 
    FROM my_table x 
    JOIN my_table y 
    ON y.value1 = x.value1 
    AND y.value2 = x.value2 
    AND y.id <= x.id 
GROUP 
    BY x.id; 

+----+--------+--------+----+ 
| id | value1 | value2 | rt | 
+----+--------+--------+----+ 
| 1 |  1 | A  | 1 | 
| 2 |  1 | B  | 1 | 
| 3 |  2 | A  | 1 | 
| 4 |  3 | A  | 1 | 
| 5 |  3 | A  | 2 | 
| 6 |  3 | B  | 1 | 
| 7 |  3 | A  | 3 | 
+----+--------+--------+----+ 

。 ..這是一個更快的方法...

SET NAMES utf8; 

SELECT x.id 
    , value1 
    , value2 
    , x.n 
    FROM 
    (SELECT id 
      , CASE WHEN value1 = @prev1 AND value2 = @prev2 THEN @i:[email protected]+1 ELSE @i:=1 END n 
      , @prev1:=value1 value1 
      , @prev2:=value2 value2 
     FROM my_table 
      , (SELECT @i:=1, @prev1:=0,@prev2:='') vars 
     ORDER 
      BY value1 
      , value2 
    ) x 
ORDER 
    BY id; 

+----+--------+--------+------+ 
| id | value1 | value2 | n | 
+----+--------+--------+------+ 
| 1 |  1 | A  | 1 | 
| 2 |  1 | B  | 1 | 
| 3 |  2 | A  | 1 | 
| 4 |  3 | A  | 1 | 
| 5 |  3 | A  | 2 | 
| 6 |  3 | B  | 1 | 
| 7 |  3 | A  | 3 | 
+----+--------+--------+------+ 
+0

太棒了!不是我可以看到我的任務中的性能差異......但我真的很感激。我現在需要嘗試瞭解你做了什麼:) – texnic

0

你會最好的做一個計數,而不是表中的存儲值。

SELECT value1, value2, COUNT(*) 
FROM TABLE 
GROUP BY value1, value2 
+0

這告訴我發生的總次數,所以我需要構建每個組的最後一行。我需要所有行,因爲我需要在組內排列行。 – texnic

0

您可以模仿在MySQL中ROW_NUMBER功能如下

SELECT a.value1, a.value2, (
SELECT count(*) from table b where a.value1 >= b.value2 AND a.value1 = b.value1) AS occurrence 
FROM table a 
+0

你可以,但不是那樣 – Strawberry