2015-10-14 56 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