0

同じクエリで min と count を使用する例を教えてください。たとえば、このテーブルでは、コードが奇数 (コード 5 の場合は 1) の労働者の数が少ないことを知りたいと考えています。

 Table Workers
      Code
       1
       2
       2
       2
       3
       3
       1
       5

ありがとう。

4

4 に答える 4

1

ウィンドウ関数を使用し、すべての関連付けられた結果を保持する別のソリューション。同点の場合(ただし任意の結果のみ)に多くの結果が必要ない場合は、次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

于 2012-11-25T11:36:28.847 に答える
1

最小値を見つけるにはサブクエリが必要であり、それを使用してカウントを再度クエリします。

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」とは異なる場合があります。

于 2012-11-24T17:57:04.077 に答える
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)
于 2012-11-24T21:38:08.360 に答える
0
select Code, count(*) MinCount
from Workers
where mod(code, 2) = 1
group by Code
order by MinCount
limit 1

SqlFiddle

カウントが最小のコードが複数ある場合は、そのうちの 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

SqlFiddle

于 2012-11-24T18:01:56.140 に答える