mysql - 计算 A 之间的 B 数量
问题描述
我试图计算在我的数据库中的每个 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
类似的东西:计算行之间的行数
编辑:
在答案的帮助下,我已将其修改为我自己的表格
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
解决方案
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 |
+----+------+
推荐阅读
- c - 在信号处理程序中遍历 TAILQ
- python - 将列表中未知数量的坐标分离成单独的坐标
- sql - 选择代码不等于 X 的 ID
- python - 如何显示seaborn产生的误差线的值?
- django - Django rest 框架 POST 多对多的额外字段
- graph - SAS中的图形使用gchart函数得出奇怪的值
- python - 如何从从 CSV 文件导入的列表/字典中的项目中选择一个随机问题?
- google-app-engine - 为什么 Google App Engine flex 构建步骤会失败,而标准适用于相同的代码?
- linux - “apt-get install linux-headers-generic”安装在不同于 $(uname-r) 的目录中
- javascript - 在轮播中循环遍历数组数据不起作用