【问题标题】:SQLite, GROUP BY with RANGESQLite,按范围分组
【发布时间】:2018-06-02 18:37:20
【问题描述】:

我正在处理以下查询:

SELECT p.bp_pod, COUNT(j.max) as 'COUNT',
SUM (CASE WHEN j.max <= 120 AND j.min <= 80 THEN 1 ELSE 0 END),
SUM (CASE WHEN  j.max > 120 AND j.max < 140 OR j.min > 80 AND j.min < 90 THEN 1 ELSE 0 END),
SUM (CASE WHEN  j.max >= 140 OR j.min >= 90 THEN 1 ELSE 0 END)
FROM (SELECT 0 as bp_pod UNION ALL
SELECT 1 as bp_pod UNION ALL
SELECT 2 as bp_pod )
p LEFT JOIN
tb_journal j
ON p.bp_pod = j.bp_pod
GROUP BY p.bp_pod LIMIT 0, 90;

但是这个查询根据bp_pod 对记录进行分组,它只能有三个值:0, 1, 2。

这是我正在使用的table

CREATE TABLE "table" ( `bp_pod` NUMERIC, `max` NUMERIC, `min` NUMERIC )

以下是我正在使用的一些价值观:

INSERT INTO table VALUES('21', '134', '78');
INSERT INTO table VALUES('13', '126', '88');
INSERT INTO table VALUES('6', '97', '54');

现在我更改了应用程序,它可以有多个值,所以我需要使用范围实现 GROUP BY,例如:

bp_pod > 5 AND bp_pod < 12
bp_pod >= 12 AND bp_pod < 21
bp_pod >= 21 AND bp_pod < 24

但在索引pod 0、1、2 中包含这样的范围。

预期的结果如下:

pod    COUNT   range_1 range_2 range_3
0       0       1        0       0
1       0       0        1       0
2       0       0        0       1

有什么线索吗? 谢谢。

【问题讨论】:

  • 请通过提供量身定制的玩具数据库创建minimal reproducible example。通过使用.dump 功能或通过提供“创建表...”和“插入...”行来实现。
  • @Yunnosch 在第一篇文章中添加

标签: sql sqlite


【解决方案1】:

由于left join,您需要小心。我认为这可以满足您的要求:

SELECT p.pod,
       COUNT(j.bp_max) as 'COUNT',
       SUM(CASE WHEN j.max <= 120 AND j.min <= 80 THEN 1 ELSE 0 END),
       SUM(CASE WHEN j.max > 120 AND j.max < 140 OR j.min > 80 AND j.min < 90 THEN 1 ELSE 0 END),
       SUM(CASE WHEN j.max >= 140 OR j.min >= 90 THEN 1 ELSE 0 END)
FROM (SELECT 0 as bp_pod, 5 as minb, 12 as maxb UNION ALL
      SELECT 1 as bp_pod, 12, 21 UNION ALL
      SELECT 2 as bp_pod, 21, 24
     ) p LEFT JOIN
     tb_journal j
     ON j.bp_pod >= p.minb AND j.bp_pod < p.maxb
GROUP BY p.bp_pod;

【讨论】:

  • 完全符合我的预期,非常感谢!只是一件事,我怎么能在最后一个“SELECT 2”中也包含 24-5 区间?
  • @Soul 。 . .我不明白你的评论。如果您需要额外的时间间隔,请将它们添加到 p 子查询中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-27
  • 2020-04-29
  • 1970-01-01
  • 1970-01-01
  • 2013-11-04
  • 2021-05-06
相关资源
最近更新 更多