Mysql 获取最小、最大行数的SQL查询

Mysql 获取最小、最大行数的SQL查询,mysql,sql,group-by,select-query,presto,Mysql,Sql,Group By,Select Query,Presto,我有以下样本数据,我想得到每个连续状态的最小和最大时间 cat subcat status logtime fruits apple 0 30-10-2017 06:00 fruits apple 0 30-10-2017 06:03 fruits apple 0 30-10-2017 06:06 fruits apple 0 30-10-2017 06:09 fruits apple 0 30-10-2017 06:12 fruit

我有以下样本数据,我想得到每个连续状态的最小和最大时间

cat     subcat  status  logtime
fruits  apple   0   30-10-2017 06:00
fruits  apple   0   30-10-2017 06:03
fruits  apple   0   30-10-2017 06:06
fruits  apple   0   30-10-2017 06:09
fruits  apple   0   30-10-2017 06:12
fruits  apple   0   30-10-2017 06:15
fruits  apple   0   30-10-2017 06:18
fruits  apple   0   30-10-2017 06:21
fruits  apple   0   30-10-2017 06:24
fruits  apple   0   30-10-2017 06:27
fruits  apple   0   30-10-2017 06:30
fruits  apple   0   30-10-2017 06:33
fruits  apple   0   30-10-2017 06:36
fruits  apple   0   30-10-2017 06:39
fruits  apple   0   30-10-2017 06:42
fruits  apple   0   30-10-2017 06:45
fruits  apple   0   30-10-2017 06:48
fruits  apple   0   30-10-2017 06:51
fruits  apple   0   30-10-2017 06:54
fruits  apple   0   30-10-2017 06:57
fruits  strawberry  1   30-10-2017 06:00
fruits  strawberry  1   30-10-2017 06:03
fruits  strawberry  1   30-10-2017 06:06
fruits  strawberry  2   30-10-2017 06:09
fruits  strawberry  1   30-10-2017 06:12
fruits  strawberry  1   30-10-2017 06:15
fruits  strawberry  1   30-10-2017 06:18
fruits  strawberry  1   30-10-2017 06:21
fruits  strawberry  1   30-10-2017 06:24
fruits  strawberry  1   30-10-2017 06:27
fruits  strawberry  1   30-10-2017 06:30
fruits  strawberry  1   30-10-2017 06:33
fruits  strawberry  1   30-10-2017 06:36
fruits  strawberry  1   30-10-2017 06:39
fruits  strawberry  2   30-10-2017 06:42
fruits  strawberry  1   30-10-2017 06:45
fruits  strawberry  1   30-10-2017 06:48
fruits  strawberry  1   30-10-2017 06:51
fruits  strawberry  1   30-10-2017 06:54
fruits  strawberry  1   30-10-2017 06:57
fruits  blueberry   0   30-10-2017 06:00
fruits  blueberry   0   30-10-2017 06:03
fruits  blueberry   0   30-10-2017 06:06
fruits  blueberry   2   30-10-2017 06:09
fruits  blueberry   0   30-10-2017 06:12
fruits  blueberry   0   30-10-2017 06:15
fruits  blueberry   0   30-10-2017 06:18
fruits  blueberry   0   30-10-2017 06:21
fruits  blueberry   0   30-10-2017 06:24
fruits  blueberry   0   30-10-2017 06:27
fruits  blueberry   0   30-10-2017 06:30
fruits  blueberry   0   30-10-2017 06:33
fruits  blueberry   0   30-10-2017 06:36
fruits  blueberry   0   30-10-2017 06:39
fruits  blueberry   2   30-10-2017 06:42
fruits  blueberry   0   30-10-2017 06:45
fruits  blueberry   0   30-10-2017 06:48
fruits  blueberry   0   30-10-2017 06:51
fruits  blueberry   0   30-10-2017 06:54
fruits  blueberry   0   30-10-2017 06:57
fruits  guaua   1   30-10-2017 06:00
fruits  guaua   1   30-10-2017 06:03
fruits  guaua   1   30-10-2017 06:06
fruits  guaua   2   30-10-2017 06:09
fruits  guaua   1   30-10-2017 06:12
fruits  guaua   1   30-10-2017 06:15
fruits  guaua   1   30-10-2017 06:18
fruits  guaua   1   30-10-2017 06:21
fruits  guaua   1   30-10-2017 06:24
fruits  guaua   1   30-10-2017 06:27
fruits  guaua   1   30-10-2017 06:30
fruits  guaua   1   30-10-2017 06:33
fruits  guaua   1   30-10-2017 06:36
fruits  guaua   1   30-10-2017 06:39
fruits  guaua   2   30-10-2017 06:42
fruits  guaua   1   30-10-2017 06:45
fruits  guaua   1   30-10-2017 06:48
fruits  guaua   1   30-10-2017 06:51
fruits  guaua   1   30-10-2017 06:54
fruits  guaua   1   30-10-2017 06:57
我正在尝试获取cat和SUBACT状态的每个状态的最小、最大时间

输出结果应如下所示:

cat     subcat      status  mintime maxtime
fruits  apple       0   30-10-2017 06:00    30-10-2017 06:57
fruits  strawberry  1   30-10-2017 06:00    30-10-2017 06:06
fruits  strawberry  2   30-10-2017 06:09    30-10-2017 06:09
fruits  strawberry  1   30-10-2017 06:12    30-10-2017 06:39
fruits  strawberry  2   30-10-2017 06:42    30-10-2017 06:42
fruits  strawberry  1   30-10-2017 06:45    30-10-2017 06:57
fruits  blueberry   0   30-10-2017 06:00    30-10-2017 06:06
fruits  blueberry   2   30-10-2017 06:09    30-10-2017 06:09
fruits  blueberry   0   30-10-2017 06:12    30-10-2017 06:39
fruits  blueberry   2   30-10-2017 06:42    30-10-2017 06:42
fruits  blueberry   0   30-10-2017 06:45    30-10-2017 06:57
fruits  guaua       1   30-10-2017 06:00    30-10-2017 06:06
fruits  guaua       2   30-10-2017 06:09    30-10-2017 06:09
fruits  guaua       1   30-10-2017 06:12    30-10-2017 06:39
fruits  guaua       2   30-10-2017 06:42    30-10-2017 06:42
fruits  guaua       1   30-10-2017 06:45    30-10-2017 06:57
尝试使用以下sql查询,但无法获得以上输出,而不是给定的最小、最大总小时数

SELECT cat,
        subcat,
        status,        
        min(logtime) as minlog,
        max(logtime) as maxlog
FROM fruits_log
WHERE 
    cat = 'fruits'
    AND date_format(logtime,'%Y-%m-%d %H) = '2017-10-30 06'
    AND status IN ('0','1','2')
GROUP BY cat,subcat,date_format(logtime,'%Y-%m-%d %H),status
ORDER BY cat,subcat,minlog ;
请帮助我在上面的查询中缺少什么

Select cat,subcat,minlog,maxlog from ( SELECT cat,
            subcat,
            status,        
            min(logtime) as minlog,
            max(logtime) as maxlog
    FROM fruits_log
    WHERE 
        cat = 'fruits'
        AND date_format(logtime,'%Y-%m-%d %H') = '2017-10-30 06'
        AND status IN ('0','1','2')
    GROUP BY cat,subcat,date_format(logtime,"%Y-%m-%d %H-%i"),status) t1 order by cat,subcat,status;
试试这个


试试这个…

你可以试试这样的东西

select  t.cat, t.subcat, t.status, min(t.logdate), max(t.logdate)
from
(
    select t1.cat, t1.subcat, t1.status, t1.logdate, count(t2.cat) grpnum
    from data t1
    left join data t2 on t1.cat = t2.cat and t1.subcat = t2.subcat and 
                         t1.status != t2.status and 
                         t1.logdate < t2.logdate
    group by t1.cat, t1.subcat, t1.status, t1.logdate
) t
group by t.cat, t.subcat, t.status, t.grpnum

我只对你的一小部分数据进行了测试,但似乎还可以。内部查询使用自联接来隔离具有相同cat、SUBACT和status值的连续行。一旦准备好了,您就可以对数据中的每组行执行分组操作。

您可以尝试类似的操作

select  t.cat, t.subcat, t.status, min(t.logdate), max(t.logdate)
from
(
    select t1.cat, t1.subcat, t1.status, t1.logdate, count(t2.cat) grpnum
    from data t1
    left join data t2 on t1.cat = t2.cat and t1.subcat = t2.subcat and 
                         t1.status != t2.status and 
                         t1.logdate < t2.logdate
    group by t1.cat, t1.subcat, t1.status, t1.logdate
) t
group by t.cat, t.subcat, t.status, t.grpnum

我只对你的一小部分数据进行了测试,但似乎还可以。内部查询使用自联接来隔离具有相同cat、SUBACT和status值的连续行。准备好后,您只需对数据中的每组行执行分组操作。

请参阅:为什么最后一行中的mintime高于maxtime?问题是考虑根据日志时间排序吗?您使用的是哪个版本的mysql?你在8岁以上吗?@RadimBača:更新的样本数据,我使用的是mysql 5。6@Strawberry:CREATE TABLE fruits\u log cat VARCHAR50 NULL DEFAULT NULL,subcat VARCHAR50 NULL DEFAULT NULL,status TINYINT4 NULL DEFAULT NULL,logtime TIMESTAMP NULL DEFAULT NULL ENGINE=InnoDB;请参阅:为什么最后一行的mintime高于maxtime?问题是考虑根据日志时间排序吗?您使用的是哪个版本的mysql?你在8岁以上吗?@RadimBača:更新的样本数据,我使用的是mysql 5。6@Strawberry:CREATE TABLE fruits\u log cat VARCHAR50 NULL DEFAULT NULL,subcat VARCHAR50 NULL DEFAULT NULL,status TINYINT4 NULL DEFAULT NULL,logtime TIMESTAMP NULL DEFAULT NULL ENGINE=InnoDB;尝试更新后的查询,如果不起作用,则提供此查询的结果。请注意,有时最好执行两个单独的查询,一个查询min,一个查询max,并将它们连接起来以更快地执行。但这仅适用于没有where子句且列上存在和索引的情况aggregated@Ab如果我们把它们放在一个查询中,你会得到什么不同,请解释一下。如果对一个索引列进行两次聚合,我发现查询没有使用索引,但这一切都取决于where子句的选择性。尝试在一个一百万行的表上,在列a上有一个索引,并在同一个查询中执行min和max,而不是单独执行并交叉连接这两个查询results@addy:im获得以下输出,cat;子类别;地位minlog;苹果;苹果0;2017-10-30 06:00:00;2017-10-30 06:57:00水果;蓝莓0;2017-10-30 06:00:00;2017-10-30 06:57:00水果;蓝莓2.2017-10-30 06:09:00;2017-10-30 06:42:00水果;瓜瓜;1.2017-10-30 06:00:00;2017-10-30 06:57:00水果;瓜瓜;2.2017-10-30 06:09:00;2017-10-30 06:42:00水果;草莓1.2017-10-30 06:00:00;2017-10-30 06:57:00水果;草莓2.2017-10-30 06:09:00;2017-10-30 06:42:00尝试更新后的查询,如果不起作用,则提供此查询的结果。只是一个旁注,有时最好执行两个单独的查询,一个是最小查询,一个是最大查询,并将它们连接起来以更快地执行。但这仅适用于没有where子句且列上存在和索引的情况aggregated@Ab如果我们把它们放在一个查询中,你会得到什么不同,请解释一下。如果对一个索引列进行两次聚合,我发现查询没有使用索引,但这一切都取决于where子句的选择性。尝试在一个一百万行的表上,在列a上有一个索引,并在同一个查询中执行min和max,而不是单独执行并交叉连接这两个查询results@addy:im获得以下输出,cat;子类别;地位minlog;苹果;苹果0;2017-10-30 06:00:00;2017-10-30 06:57:00水果;蓝莓0;2017-10-30 06:00:00;2017-10-30 06:57:00水果;蓝莓2.2017-10-30 06:09:00;2017-10-30 06:42:00水果;瓜瓜;1.2017-10-30 06:00:00;2017-10-30 06:57:00水果;瓜瓜;2.2017-10-30 06:09:00;2017-10-30 06:42:00水果;草莓1.2017-10-30 06:00:00;2017-10-30 06:57:00水果;草莓2.2017-10-30 06:09:00;2017-10-30 06:42:00