2017-11-05 5 views
0

私はSQLに関連する質問があります。私は2つの列、tasker_IDとworking_hoursを含むデータセットを持っています。GROUP BYクエリで最低合計を選択するにはどうすればよいですか?

列は同類をこのようになります。

tasker_id working_hours 
    1   30 
    2 .   20 
    3   14 
    1   23 
    4   24 
    2   39 
    3   27 
    2   18 
    5   0 

... をそして私はタスカーは少なくとも働いされているのを確認したいですか? 、私は簡単に少なくとも労働時間を持っているIDを見ることができ、オーダーから

select tasker_id, sum(working_hours) as sum_hours 
from test.test 
group by tasker_id 
having sum_hours>0 
order by sum_hours; 

:私はこれを達成するために、このようなコードを使用し、まず

(我々は完全に0時間を働いていた人をカウントされません)私は最小限の機能を使用してのIDが最も少ない勤務時間を表示するようにします。ここ

そして、私のSQLコードです:

select tasker_id, min(sum_worked) as min_worked from (
select tasker_id, sum(working_hours) as sum_worked 
from test.test 
group by tasker_id 
having sum_worked>0)a 
; 

しかし、コードが間違っているようだ、誰かがこの上で私を導くことができますか?私はその価値関数がグループの方法で行くことを知っていましたが、どこが間違っているのか分かりません。または、誰かが正しいコードを直接表示できますか?

PS:私はMySQLを使用しています。

+0

あなたはなど、(例えばMySQLの、SQL Serverを使用しているSQLのバージョンは何)? –

+0

これらのクエリが機能しない理由(つまり、出力が期待どおりでない理由)のデモンストレーションがなければ、これは少し難解です。この質問も放棄されているように見えるので、私は閉会することにしています。ここには[mcve]が必要です。 – halfer

答えて

0

問題は内部クエリのwhereです。 selectの前にwhereが実行されているため、where句内のsum_workedを参照しています。代わりにhavingを使用してください。

select tasker_id, min(sum_worked) as min_worked 
from (
    select tasker_id, sum(working_hours) as sum_worked 
    from test.test 
    group by tasker_id 
    having sum_worked>0 
    ) a; 
+0

こんにちは、私はコードを変更しましたが、まだいくつかのエラーがあります。どこに問題があるのか​​わからないようです。 –

0

whereを使用したため、where_workedはテーブルに定義されていません。 where where条件を "having sum_worked> 0"に置き換え、group byステートメントの後に置く必要があります。

又は状態は、外部クエリ

0

にあるようにどこにあなたが可能な分析機能を持っている場合は、あなたが試すことができます同じように移動することができます。

SELECT tasker_id, sum_worked 
FROM 
(
    SELECT 
     tasker_id, SUM(working_hours) AS sum_worked, 
     ROW_NUMBER() OVER (ORDER BY SUM(working_hours)) rn 
    FROM test.test 
    GROUP BY tasker_id 
    HAVING sum_worked > 0 
) t 
WHERE rn = 1; 

は、労働時間の最低数のネクタイがあるはずですすべての結びつきが必要な場合は、ROW_NUMBERをランク機能に置き換えることができます。リミット文をサポートしているデータベースで

、と我々は唯一の最初の最低タスカーをしたい、私たちはこれを簡素化することができます仮定:

SELECT 
    tasker_id, SUM(working_hours) AS sum_worked 
FROM test.test 
GROUP BY tasker_id 
HAVING sum_worked > 0 
ORDER BY sum_worked 
LIMIT 1;  -- works on MySQL and Postgres 
+0

あなたが心配していることは分かっていましたが、最小の勤務時間とそのIDを選択するためにmin関数を使用することが欲しいですが、私が得たのはすべてのIDの最小勤務時間です。そしてそれは私を混乱させた。 –

+0

@ XiaoxiChen私の2番目のクエリは、MySQLにとって良いアプローチです。 –

+0

ありがとう!しかし、私の主な関心事は、Min関数のサブクエリです。どのように私はそれを正しく得ることができますか?私は方法を試してみましたが、結果はそのIDの最小時間のケースだけではありませんでした。私はグループごとに文を追加すると、すべてのID最小時間が表示されます。 –

関連する問題