我有一张像这样的桌子(桌子):
id | from | to | count
1 | 1 | 25 | 25
1 | 26 | 50 | 25
1 | 76 | 100 | 25
1 | 1501 | 1525 | 25
而我想要的是"完整"范围如下:
id | from | to | count
1 | 1 | 50 | 50
1 | 76 | 100 | 25
1 | 1501 | 1525 | 25
我使用MySQL并且我的(可怕的)查询无法正常工作,因为我无法返回我想要的内容。
SELECT id, MIN(from), MAX(to), SUM(count)
FROM table
GROUP BY id
HAVING (MAX(to)-MIN(from)+1) = SUM(count)
答案 0 :(得分:2)
请注意,以下数据集比问题中提供的要复杂一点......
DROP TABLE IF EXISTS my_table;
CREATE TABLE my_table
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,val_from INT NOT NULL
,val_to INT NOT NULL
,count INT NOT NULL
);
INSERT INTO my_table VALUES
(1,1,25,25),
(2,26,35,12),
(3,36,50,13),
(4,76,100,25),
(5,1501,1525,25);
SELECT MIN(val_from) start
, MAX(val_to) finish
, SUM(count) total
FROM
(
SELECT *
, CASE WHEN val_from <= @prev_val_to + 1 THEN @i := @i ELSE @i:=@i+1 END i
, @prev_val_to := val_to prev_val_to
FROM my_table
, (SELECT @prev_val_to := null, @i:=1) vars
ORDER
BY id
) x
GROUP BY i;
+-------+--------+-------+
| start | finish | total |
+-------+--------+-------+
| 1 | 50 | 50 |
| 76 | 100 | 25 |
| 1501 | 1525 | 25 |
+-------+--------+-------+
答案 1 :(得分:1)
Select
id,
case when [From] <= 50 then 1
when [From] <= 100 then 51
when [From] <= 1525 then 101 end [From],
case when [From] <= 50 then 50
when [From] <= 100 then 100
when [From] <= 1525 then 1525 end [to],
Sum(count) count
From table
group by id, case when [From] <= 50 then 1
when [From] <= 100 then 51
when [From] <= 1525 then 101 end