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;
我想做的是 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;