如何从表中查询最小值和最大值并将其显示为范围/序列?

时间:2017-05-02 16:54:45

标签: mysql sql group-by having

我有一张像这样的桌子(桌子):

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)

2 个答案:

答案 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