SQL Select 具有 MAX 非零值的记录 如果存在,否则 select 具有零值的记录

SQL Select record with MAX non zero value If exists otherwise select record with zero value

我想做的是 select 在我 table 的给定日期范围内每个唯一时间戳的单个记录。如果同一时间戳存在多个记录,我想获得最大的非零记录,或者如果只有零值记录被 returned 我只想 return 那些零值记录之一。 我一直在使用 'almost' 的查询是

select timestamp, MAX(value) FROM myTable WHERE *conditions*... group by [timestamp] Order By [timestamp] ASC;

在 returned 记录为零和负数之前,它显然运行良好,在这种情况下,它 returns 为零记录,因为它大于负记录。在那种情况下,我想要 return 负值记录之一而不是零记录。如果我尝试通过将 where 语句更改为

来解决该问题
WHERE [Value] <> 0

那么如果只有零值记录被 returned,我什么也得不到。我的首要任务是 return 每个时间戳记一个最大的非零值记录,但如果只存在零值记录,那么只有 return 其中之一,如果时间戳只存在空记录,我会想要一个单个空记录 returned.

我会做的是 select 您描述的最大非零值:

SELECT timestamp, MAX(valueCol) AS maxValue
FROM myTable
WHERE valueCol <> 0
GROUP BY timestamp;

然后,您可以使用外连接获取所有时间戳,并使用 COALESCE() 函数将未 return 的值替换为 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;

编辑:根据您的评论和对问题的编辑,您可以按以下方式分解问题。我写了一个查询(见上文)来获取每个时间戳的最大非零值。我还可以编写一个查询来获取 maximum/minimum 时间戳为 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 关键字添加到 return 唯一 id/maxValue 对,因为多行将被 return 编辑,否则因为 id 在同一个 table 中出现多次.

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

试一试,将@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 看起来像原来的 post。

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;