我想做的是从我的表中给定日期范围内的每个唯一时间戳选择一条记录。如果同一时间戳存在多个记录,我想获得最大的非零记录,或者如果只返回零值记录,我只想返回那些零值记录之一。 我一直在使用的查询“几乎”起作用了
select timestamp, MAX(value) FROM myTable WHERE *conditions*... group by [timestamp] 按 [timestamp] ASC 排序;
在返回的记录为零和负数之前,它显然运行良好,在这种情况下,它返回零记录,因为它大于负记录。在那种情况下,我想返回一个负值记录而不是零记录。如果我尝试通过将 where 语句更改为
WHERE [Value] <> 0
如果只返回零值记录,我什么也得不到。我的首要任务是为每个时间戳返回一个最大的非零值记录,但如果只存在零值记录,则只返回其中一个,如果时间戳只存在空记录,我希望返回一个空记录。
最佳答案
我要做的是以您描述的方式选择最大非零值:
SELECT timestamp, MAX(valueCol) AS maxValue
FROM myTable
WHERE valueCol <> 0
GROUP BY timestamp;
然后,您可以使用外连接获取所有时间戳,并使用 COALESCE()
函数将未返回的值替换为 0:
SELECT m.timestamp, COALESCE(t.maxValue, 0) AS maxValue
FROM myTable m
LEFT JOIN(
SELECT timestamp, MAX(valueCol) AS maxValue
FROM myTable
WHERE valueCol <> 0
GROUP BY timestamp) t ON t.timestamp = m.timestamp;
编辑:根据您的评论和对问题的编辑,您可以按以下方式分解问题。我写了一个查询(见上文)来获取每个时间戳的最大非零值。我还可以编写一个查询来获取最大/最小时间戳为 0 的时间戳,如下所示:
SELECT id, 0 AS MaxVal
FROM myTable
GROUP BY id
HAVING MAX(valueCol) = 0 AND MIN(valueCol) = 0;
其余组的值为空。为了获得这些,我可以执行与前面示例相同的外部连接,但省去 COALESCE() 函数,以便空值保持原样:
SELECT DISTINCT m.id, t.maxVal
FROM myTable m
LEFT JOIN(
SELECT id, MAX(valueCol) AS maxVal
FROM myTable
WHERE valueCol <> 0
GROUP BY id
UNION ALL
SELECT id, 0 AS maxVal
FROM myTable
GROUP BY id
HAVING MIN(valueCol) = 0 AND MAX(valueCol) = 0) t ON t.id = m.id;
我添加了 DISTINCT 关键字以返回唯一的 id/maxValue 对,否则将返回多行,因为 id 在同一个表中出现多次。
我在 SQL Fiddle 中对此进行了测试效果很好。
关于mysql - SQL 选择具有 MAX 非零值的记录如果存在否则选择具有零值的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31300073/