2016-05-10 14 views
0

別の列の最小値を見つけた後に他のフィールドを与えるクエリを作成する際に問題が発生しました。私はこれを試した:最小値、グループ、その他のフィールドを選択するSQL

Select WorkOrder, min(Job), Details 
From Jobs 
Group by WorkOrder 

しかし、それは動作しません。

これは私のWorkOrderはによって最低のジョブ番号のリストを与える:

Select WorkOrder, min(Job) 
From Jobs 
Group by WorkOrder 

私は最低のジョブ番号と行項目の詳細をしたいです。私は間違って何をしていますか?この

Select * From Jobs Where Job in 
(Select min_job From (Select WorkOrder ,min(Job) as min_job From Jobs 
Group by WorkOrder) 
) 
+0

'Details'は' GROUP BY'で指定された項目の1つではありません – ydoow

答えて

0

あなたは

Select WorkOrder, min(Job), Details 
From Jobs 
Group by WorkOrder, Details 
+0

私はそれが簡単だったと思います。私が取り組んでいるテーブルが何千ものエントリを持っているとしましょう。各作業オーダーには1つ以上のジョブがあり、各ジョブには1つの詳細があります。各WorkOrderの番号が最も小さいJobのDetailsが必要です。 – alcor8

+0

次に、グループ化された結果をマスター表に結合するための行ベースのキーが必要になるでしょう。テーブルに主キーがありますか? – ydoow

0

このクエリを試みることがあります(分を追加する必要があります)あなたの状態で使用すると、GROUP BY句を使用すると、あなたのSELECT文のすべてがどちらかに持っています集計関数(min、max、ectなど)であるか、GROUP BY句に含める必要があります。詳細はGROUP BY句には含まれていないため、文はコンパイルされません。 GROUP BY句にDetailsを含めると、WorkOrderとDetailsの各組み合わせの最小値(ジョブ)が得られますが、これはおそらくあなたが望むものではありません。

この問題を解決する方法はいくつかあります。 IMOは、分(仕事)とワークオーダーを選択し、その結果をジョブテーブルに戻して詳細を選択するのが最も簡単です。これを行うには、ジョブ表に一意の主キーが必要です。

SELECT 
minWorkOrder.WorkOrder 
minWorkOrder.MinJob 
Jobs.Details 
FROM 
(Select Key, WorkOrder, min(Job) as MinJob 
From Jobs 
Group by Key, WorkOrder) AS minWorkOrder 
INNER JOIN Jobs 
ON Jobs.Key = minWorkOrder.Key 

テーブルに固有のキーがない場合、物事はよりトリッキーになります。このクエリの範囲では、min(Job)とWorkOrderのすべての組み合わせが一意であることは、おそらく安全な前提です。あなたはこれらのフィールドの両方に参加することができ、あなたは正しい答えを得なければなりません。

SELECT 
minWorkOrder.WorkOrder 
minWorkOrder.MinJob 
Jobs.Details 
FROM 
(Select WorkOrder, min(Job) as MinJob 
From Jobs 
Group by WorkOrder) AS minWorkOrder 
INNER JOIN Jobs 
ON Jobs.Job = minWorkOrder.MinJob AND Jobs.WorkOrder = minWorkOrder.WorkOrder 
0

あなたはこの試してみてください:ここでは、列の値をランク付けしている

Select A.WorkOrder, A.Job, A.Details 
From(Select WorkOrder, Job, Details, Row_Number() 
    over(Partition by WorkOrder Order by Job ASC) as Num 
    From Jobs)A 
    where A.Num = 1 
+0

この回答は、2つのワークオーダーが同じジョブ数を持つことができないと仮定しています。 – user3538411

0

を私はこの作業の答えを提供し、私の部署のエンジニアと協力各作業オーダーの昇順のジョブ。最後のWHERE句rnk = 1は、各作業オーダーの最小値を持つジョブのみをフェッチします。ワークオーダーに同じ値のジョブが2つ以上ある場合、RANK()は同じランクを割り当てます。したがって、ワークオーダーに最小値を持つジョブが2つ以上ある場合は、すべてのジョブを返します。

+0

これを使用すると、ワークオーダーのジョブで同じ値の行が見逃されることがあります。特定の作業オーダーのジョブ列に一意の値がある場合は、完全に機能します。 –

0
with cte as 
(
select workorder,Job, Details, rank() over (partition by workorder order by job asc) as rnk 
from 
Jobs 
) 
select workorder,Job, Details from cte 
where rnk = 1 

SELECT WorkOrder, Details 
from Jobs 
where Job IN (SELECt min(Job), WorkOrder from Jobs GROUP BY WorkOrder); 
+0

いくつかの説明を追加してください。 – gofr1

関連する問題