Mysql SQL选择具有最大非零值的记录(如果存在),否则选择具有零值的记录

Mysql SQL选择具有最大非零值的记录(如果存在),否则选择具有零值的记录,mysql,Mysql,我想做的是从表中为给定日期范围内的每个唯一时间戳选择一条记录。如果同一时间戳存在多个记录,我希望得到最大的非零记录,或者如果只返回零值记录,我只希望返回其中一个零值记录。 我一直使用的“几乎”的查询是有效的 从myTable中选择timestamp,MAXvalue,其中*条件*。。。按[timestamp]分组按[timestamp]ASC排序 在返回的记录为零和负数之前,它显然工作得很好,在这种情况下,它返回零记录,因为它大于负数记录。在这种情况下,我希望返回一个负值记录,而不是零记录。如果

我想做的是从表中为给定日期范围内的每个唯一时间戳选择一条记录。如果同一时间戳存在多个记录,我希望得到最大的非零记录,或者如果只返回零值记录,我只希望返回其中一个零值记录。 我一直使用的“几乎”的查询是有效的

从myTable中选择timestamp,MAXvalue,其中*条件*。。。按[timestamp]分组按[timestamp]ASC排序

在返回的记录为零和负数之前,它显然工作得很好,在这种情况下,它返回零记录,因为它大于负数记录。在这种情况下,我希望返回一个负值记录,而不是零记录。如果我试图通过将where语句改为

WHERE [Value] <> 0

如果只返回零值记录,那么我什么也得不到。我的优先级是每个时间戳返回一个最大的非零值记录,但如果只有零值记录,则只返回其中一个,如果时间戳只有空记录,我希望返回一个空记录。

我要做的是按照您描述的方式选择最大非零值:

SELECT timestamp, MAX(valueCol) AS maxValue
FROM myTable
WHERE valueCol <> 0
GROUP BY timestamp;
编辑:根据您的评论和对问题的编辑,您可以按以下方式分解问题。我编写了一个如上所示的查询,以获取每个时间戳的最大非零值。我还可以编写一个查询来获取最大/最小时间戳为0的时间戳,如下所示:

SELECT id, 0 AS MaxVal
FROM myTable
GROUP BY id
HAVING MAX(valueCol) = 0 AND MIN(valueCol) = 0;
其余组的值将为null。要获得这些值,我可以执行与上一个示例相同的外部联接,但不使用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在同一个表中多次出现,因此将返回多个行


我在中对此进行了测试,效果很好。

尝试一下,将@ValueCol更改为1,0,null工作正常

DECLARE @ValueCol INT 
SET @ValueCol = Null

Select CASE WHEN MAX( CASE WHEN @ValueCol IS NULL THEN 1 ELSE 0 END) = 0  THEN MAX(@ValueCol) END
因此,这将使您的SQL从原始帖子中看起来像这样

select 
timestamp
, CASE WHEN MAX( CASE WHEN value IS NULL THEN 1 ELSE 0 END) = 0  THEN MAX(value) END
FROM myTable 
WHERE *conditions*... 
group by [timestamp] 
Order By [timestamp] ASC;

如果你只想拿回一张唱片。。。为什么要按邮戳订购?只需选择timestamp,表中的值*条件*order by value desc limit 1 max value将是第一条记录,因为order by value desc和limit 1将确保只返回一条记录。不管值是0还是1。现在,如果没有任何记录,由于那里的条件,这是一个不同的故事。。。但你是说唱片又回来了。。。现在,您返回的最大值可能与其旁边列出的时间戳无关……我只希望每个唯一时间戳有一条记录,但我的查询可能返回数百条唯一时间戳记录。例如,当我从我们的daily data表查询90天时,我预计会收到90条记录。我已经尝试过了,但可能我需要在我的问题中更具体一些,实际上有3种类型的记录,非零、零和空。如果存在非零记录,我会首先返回非零记录,如果不存在非零记录,我会返回零记录,如果零记录不存在但空记录存在,我会返回空记录。在你的回答中,我相信空记录也会返回为零。我理解。这是可能的,今天的工作中互联网是不稳定的,所以我会在可能的时候进行编辑。@AaronKruger请参阅编辑。我希望这是你所期待的。谢谢你这正是我所需要的,而且非常简短!我在我们的数据库上测试了它,它可以完美地处理非零、零和空时间戳记录。我会投票支持你的答案,但我还没有足够的代表分数。一旦我这样做了,我会回来投票。任何时候,SQL对我来说都是一个有趣的游戏,我喜欢在我不编写自己的代码时看到所有这些问题。和你一样,我以前也曾处理过这种情况,这是我能想到的最优雅的事情。很高兴它对你有用!
select 
timestamp
, CASE WHEN MAX( CASE WHEN value IS NULL THEN 1 ELSE 0 END) = 0  THEN MAX(value) END
FROM myTable 
WHERE *conditions*... 
group by [timestamp] 
Order By [timestamp] ASC;