同じクエリで min と count を使用する例を教えてください。たとえば、このテーブルでは、コードが奇数 (コード 5 の場合は 1) の労働者の数が少ないことを知りたいと考えています。
Table Workers
Code
1
2
2
2
3
3
1
5
ありがとう。
同じクエリで min と count を使用する例を教えてください。たとえば、このテーブルでは、コードが奇数 (コード 5 の場合は 1) の労働者の数が少ないことを知りたいと考えています。
Table Workers
Code
1
2
2
2
3
3
1
5
ありがとう。
ウィンドウ関数を使用し、すべての関連付けられた結果を保持する別のソリューション。同点の場合(ただし任意の結果のみ)に多くの結果が必要ない場合は、次ROW_NUMBER()
の代わりに使用しRANK()
ます。
SELECT code
FROM
( SELECT code
, RANK() OVER (ORDER BY COUNT(*)) AS rnk
FROM workers
WHERE MOD(code, 2) = 1
GROUP BY code
) tmp
WHERE rnk = 1 ;
(Oracle 11g2)でテスト済み:SQL-Fiddle
最小値を見つけるにはサブクエリが必要であり、それを使用してカウントを再度クエリします。
select code, count(*) -- get the count for the code found in the subquery
from workers
where code = (
select min(code) -- return the minimum code found
from workers
where mod(code, 2) = 1) -- only odd codes
group by code; -- group by the non-aggregated column(s0
コメントから、ワーカー数が最も少ない奇妙なコードが必要なようです。
select code, count(*)
from workers
where mod(code, 2) = 1
group by code
order by 2
limit 1;
どのデータベースを使用しているかは言わないので、「最初の行のみを返す」という構文は、mysql の方法である「LIMIT 1」とは異なる場合があります。
これはORACLE
あなたの問題のためであり、解決します。
with newt as
( select code, count(*) cnt
from workers
where mod(code, 2) = 1
group by code)
select *
from newt
where cnt in (select min(cnt)
from newt)
select Code, count(*) MinCount
from Workers
where mod(code, 2) = 1
group by Code
order by MinCount
limit 1
カウントが最小のコードが複数ある場合は、そのうちの 1 つだけを任意に選択することに注意してください。それらすべてが必要な場合は、複雑になり、サブクエリとの結合が必要になります。そのクエリは次のとおりです。
SELECT w.Code, CodeCount
FROM (SELECT Code, count(*) CodeCount
FROM Workers
WHERE mod(code, 2) = 1
GROUP BY Code) w
JOIN (SELECT Code, count(*) MinCount
FROM Workers
WHERE mod(code, 2) = 1
GROUP BY Code
ORDER BY MinCount
LIMIT 1) MinQuery
ON CodeCount = MinCount