2016-05-18 5 views
0

列を検査する必要があるSQL問合せの最初の(または最後の)行を取得しようとしています。実際はcount()の結果になります。Count()の値をチェックしている場合、Oracle SQLの最初の行または最後の行を取得する方法

私は彼らを見つけるためにいくつかの回避策を見つけることができますが、インデクサーと情報が繰り返されていないときに、それが繰り返されます。この繰り返しでは、私は3つの値を受け取りますつまり、私は2の代わりに4行を受け取っています。

誰も2行を切り捨てて1つだけを選択する方法を知っていましたか?ここで

は、コードは次のとおりです。事前に

Create view TotalEmpleadosPorDepto as 
Select DEPARTMENT_NAME DEPARTAMENTO, count(EMPLOYEE_ID) TOTAL_EMPLEADOS 
from DEPARTMENTS join EMPLOYEES USING(DEPARTMENT_ID) 
group by DEPARTMENT_NAME 
order by DEPARTMENT_NAME; 

select TotalEmpleadosPorDepto.DEPARTAMENTO "DEPARTAMENTO", 
TotalEmpleadosPorDepto.TOTAL_EMPLEADOS "TOTAL EMPLEADOS" 
from TotalEmpleadosPorDepto 
where TotalEmpleadosPorDepto.TOTAL_EMPLEADOS = 
(select Max (TOTAL_EMPLEADOS) from TotalEmpleadosPorDepto) 
or 
TotalEmpleadosPorDepto.TOTAL_EMPLEADOS = 
(select FIRST_VALUE(min (TOTAL_EMPLEADOS)) from TotalEmpleadosPorDepto) 
order by DEPARTAMENTO; 

おかげ

PS:質問を改善するために、任意の質問、提案やコメントを大幅にapreciatedされるだろう。

+1

最初または最後の行はどういう意味ですか? count(EMPLOYEE_ID)の値の最大値または最小値を持つ行?最大(または最小)の従業員数のために2つ以上の部門が結ばれている場合は、どのような選択が必要ですか? – mathguy

+2

小さな例を追加すると助けになるでしょう:ここでは部署とその数がここに現在の出力です、ここで私のニーズに合っていない理由はここにあります。これは、問題を説明するためのちょっとした構成例です。 – mathguy

答えて

1

あなたはanalytic rank() or dense_rank() functionsを使用してランク付け割り当てることCTEまたはインライン・ビューを使用することができます。

select departamento, total_empleados 
from (
    select departamento, total_empleados, 
    rank() over (order by total_empleados) as rnk1, 
    rank() over (order by total_empleados desc) as rnk2 
    from totalempleadospordepto 
) 
where rnk1 = 1 or rnk2 = 1; 

あなたにつながりがある複数の行を示すなど、既存のクエリと同じ結果を与えるはずです。

select departamento, total_empleados, rnk1, rnk2 
from (
    select departamento, total_empleados, 
    row_number() over (order by total_empleados) as rnk1, 
    row_number() over (order by total_empleados desc) as rnk2 
    from totalempleadospordepto 
) 
where rnk1 = 1 or rnk2 = 1; 

...しかし、重複行のどのあなたが得るです:だけに

は最高値と最低値それがランキングの数字を重複しないよう、代わりにrow_number()を使用する可能性があるため1行を取得します不確定。それでもかなり任意思わ示さきたもので

select departamento, total_empleados 
from (
    select departamento, total_empleados, 
    rank() over (order by total_empleados, departamento) as rnk1, 
    rank() over (order by total_empleados desc, departamento desc) as rnk2 
    from totalempleadospordepto 
) 
where rnk1 = 1 or rnk2 = 1; 

が、少なくとも一貫した結果を与える:departamentoを使用して、たとえば - それは、追加order by表現で、絆が破損する方法を指定する方が良いでしょう。

関連する問題