计算A之间的B数

时间:2018-12-05 10:59:21

标签: mysql

我正在尝试计算数据库中每个A之前获得的B。

表类似:

ID  -  value  -  datetime
10       A     2018-10-10 10:10:10
 9       B     2018-10-10 09:09:09
 8       B     2018-10-10 08:08:08
 7       B     2018-10-10 07:07:07
 6       B     2018-10-10 06:06:06
 5       A     2018-10-10 05:05:05
 4       B     2018-10-10 04:04:04
 3       B     2018-10-10 03:03:03
 2       B     2018-10-10 02:02:02
 1       A     2018-10-10 01:01:01

但想从

ID  -         datetime   -    count 
10    2018-10-10 10:10:10      4
 5    2018-10-10 05:05:05      3
 1    2018-10-10 01:01:01      0

类似Counting number of rows between rows

编辑:

在答案的帮助下,我已将其修改为自己的表格

SELECT a.ID
     , COALESCE(b.i,0) cnt
  FROM 
     ( SELECT x.*
            , MAX(y.ID) y_ID
         FROM tapdatabeer x         
         LEFT
         JOIN tapdatabeer y
           ON y.ID < x.ID
          AND y.beerstatus = '0'
        WHERE x.beerstatus = '1' AND x.beerline = 5 AND x.masterID = 4015
        GROUP 
           BY x.ID
     ) a
  LEFT
  JOIN 
     ( SELECT ID
            , beerstatus            
            , CASE WHEN beerstatus = '0' then @i:=@i+1 ELSE @i:=0 END i 
         FROM tapdatabeer 
            , (SELECT @i:=0) vars 
        WHERE beerline = 5 AND masterID = 4015 
        ORDER 
           BY ID
     ) b
    ON b.ID = a.y_ID

我已经手动检查了此处每行的结果应该在200到210之间。 我得到这个的原因是因为我的ID不在一行,因为此表中也有C和D。 我需要为查询创建一个自定义计数器。 但是我的结果是:

  ID    cnt
258991    0
265187    0
266442    0
272383    0
273134  206
277077    0

1 个答案:

答案 0 :(得分:1)

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(id SERIAL PRIMARY KEY
,value CHAR(1) NOT NULL
);

INSERT INTO my_table VALUES
('A'),('B'),('B'),('B'),('A'),('B'),('B'),('B'),('B'),('A');

SELECT a.id
     , COALESCE(b.i,0) cnt
  FROM 
     ( SELECT x.*
            , MAX(y.id) y_id
         FROM my_table x
         LEFT
         JOIN my_table y
           ON y.id < x.id
          AND y.value = 'b'
        WHERE x.value = 'a'
        GROUP 
           BY x.id
     ) a
  LEFT
  JOIN 
     ( SELECT id
            , value
            , CASE WHEN value = 'b' then @i:=@i+1 ELSE @i:=0 END i 
         FROM my_table 
            , (SELECT @i:=0) vars 
        ORDER 
           BY id
     ) b
    ON b.id = a.y_id;

+----+------+
| id | cnt  |
+----+------+
|  1 |    0 |
|  5 |    3 |
| 10 |    4 |
+----+------+
相关问题