我有这样的数据表
Table 1
Field1 Field2 Field3
00:00:01 Test1 10.0
00:00:01 Test2 7.3
00:00:01 Test3 11.03
00:00:10 Test1 11.0
00:00:10 Test2 17.3
00:00:10 Test3 15.03
01:00:01 Test1 5.0
01:00:01 Test2 4.3
01:00:01 Test3 4.03
01:00:10 Test1 5.0
01:00:10 Test2 4.3
01:00:10 Test3 4.03
02:00:01 Test1 78.0
02:00:01 Test2 43.3
02:00:01 Test3 19.03
02:00:10 Test1 79.0
02:00:10 Test2 46.3
02:00:10 Test3 14.03
我需要使用以下查询每小时Iam的最大值,但我希望有时更有效地保存在其他表中
INSERT INTO table2 (Time, TYPE, Number)
SELECT Field1, Field2, max(Field3)
FROM table1
WHERE Field1 like '00:%' ;
INSERT INTO table2 (Time, TYPE, Number)
SELECT Field1, Field2, max(Field3)
FROM table1
WHERE Field1 like '01:%' ;
INSERT INTO table2 (Time, TYPE, Number)
SELECT Field1, Field2, max(Field3)
FROM table1
WHERE Field1 like '02:%' ;
..............
..............
to '23:%'
答案 0 :(得分:0)
您可以使用WHERE NOT EXISTS
子句。
SELECT Field1 as hr, Field2 as name, Field3 as num
FROM table1 orig
WHERE NOT EXISTS (
SELECT 1
FROM table1 lower
WHERE lower.Field3 > orig.Field3
AND lower.Field1 = orig.Field1
)
所以基本上你说'#34;只给我一行,其他行没有相同的小时和更高的数字" - 假设您有适当的索引,这将是一个非常有效的查询。
我还建议您使用比field1,table1等更好的名称
我只剩下SELECT
语句 - 将其包装在INSERT
语句或其他任何需要的内容中。
答案 1 :(得分:0)
如果我正确理解您的查询,您希望在Field3
表格中显示的每小时插入与table1
相关的最大记录。如果是这样,那么您可以取消所有这些insert语句并将其替换为单个insert语句。这个单一语句使用子查询来识别您想要插入的所有记录,每个小时一次,一次性。
INSERT INTO table2 (Time, TYPE, Number)
SELECT
t1.Field1,
t1.Field2,
t1.Field3
FROM table t1
INNER JOIN
(
SELECT HOUR(Field1) AS max_time, MAX(Field3) AS max_field3
FROM table1
GROUP BY HOUR(Field1)
) t2
ON HOUR(t1.Field1) = t2.max_time AND
t1.Field3 = t2.max_field3
请注意,如果您的表中有多个日期,那么按小时进行聚合可能有点奇怪。相反,您可能希望使用四舍五入到整个小时的整个日期进行汇总。
答案 2 :(得分:0)
您需要GROUP BY TruncToHour(Field)
来实现这一目标。诀窍是实现TruncToHour()
,您可以这样做:
TIME(TIME_FORMAT( Field1, '%H:00:00'))
这会获取每一行中的时间值并剥离分钟和秒,将其替换为零。
使用它,您将获得此SELECT查询(http://sqlfiddle.com/#!9/a50405/5/0)
SELECT TIME(TIME_FORMAT( Field1, '%H:00:00')) Field1,
Field2, MAX(Field3) Field3
FROM table1
GROUP BY TIME(TIME_FORMAT( Field1, '%H:00:00'), Field2
然后,您可以在INSERT语句中使用该结果集。
如果要查找table1中与每小时field3的最大值对应的详细信息行,则需要使用上述查询作为子查询的嵌套查询。像这样。 (http://sqlfiddle.com/#!9/a50405/16/0)
这使用一个查询模式,在每个GROUP BY组中找到MAX值,然后将其连接回原始表,以查找MAX值来自的详细信息行。
SELECT a.Field1, a.Field2, a.Field3
FROM table1 a
JOIN (
SELECT TIME(TIME_FORMAT( Field1, '%H:00:00')) Field1,
Field2, MAX(Field3) Field3
FROM table1
GROUP BY TIME(TIME_FORMAT( Field1, '%H:00:00')), Field2
) b ON TIME(TIME_FORMAT( a.Field1, '%H:00:00')) = b.Field1
AND a.Field2=b.Field2
AND a.Field3=b.Field3