让我们说我的桌子看起来像下面的那张桌子。我想根据两个标准查询表。 如果id的计数为负数,我希望根据该ID获得最大结果。此外,如果一个id只有正数而不是我想根据该id得到min。
id tcount
--- ------
1 -5
1 -10
1 5
2 20
2 30
3 -40
3 -50
所以我想得到的结果就是这个
id tcount
-- -----
1 -5
2 20
3 -40
我的查询看起来像这样,我需要添加更多逻辑
SELECT id, max(count) as tcount
FROM atable
WHERE count < 0
GROUP by id
答案 0 :(得分:1)
让我们看看这是否有效。要获得最小/最大负数和最小/最大正数,case ... end
可以帮助您:
select id
, min(case when tcount < 0 then tcount end) -- Minimum negative
, max(case when tcount < 0 then tcount end) -- Maximum negative
, min(case when tcount >= 0 then tcount end) -- Minimum non-negative
, max(case when tcount >= 0 then tcount end) -- Maximum non-negative
, min(tcount)
, max(tcount)
from atable
group by id;
再次阅读你的问题(拿了两三个读数),我发现你想要每个组的数字接近零。所以:
select id
, min(abs(tcount)) * if(min(tcount) = min(abs(tcount)), 1, -1)
from atable
group by id;
解释:
min(abs(tcount))
将获得tcount
的绝对值的最小值(即,最接近零的那个)。剩下的就是获得数字的正确符号,以及if()
的用途:如果数字的绝对值的最小值等于数字的最小值,那么number是正数(因为只有当min(tcount)
大于零或等于零时才会发生),在其他情况下,数字为负数。