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