web-dev-qa-db-ja.com

列のn番目の最大値を見つけるためのクエリ

列の2番目、3番目、.n番目の最大値を見つけたい

24

列を降順で並べ替えてから、n番目の行から値を取得できます。

編集::

コメントリクエストごとに更新。 [〜#〜] warning [〜#〜]完全にテストされていません!

SELECT DOB FROM (SELECT DOB FROM USERS ORDER BY DOB DESC) WHERE ROWID = 6

上記のようなものはOracleで動作するはずです...最初に構文を正しく取得する必要があるかもしれません!

11
TK.

給与用の単一の列を持つ次のEmployeeテーブルを検討してください。

 + ------ + 
 | Sal | 
 + ------ + 
 | 3500 | 
 | 2500 | 
 | 2500 | 
 | 5500 | 
 | 7500 | 
 + ------ + 

次のクエリは、N番目の最大要素を返します。

select SAL from EMPLOYEE E1 where 
 (N - 1) = (select count(distinct(SAL)) 
            from EMPLOYEE E2 
            where E2.SAL > E1.SAL )

例えば2番目の最大値が必要な場合、

  select SAL from EMPLOYEE E1 where 
     (2 - 1) = (select count(distinct(SAL)) 
                from EMPLOYEE E2 
                where E2.SAL > E1.SAL )
 + ------ + 
 | Sal | 
 + ------ + 
 | 5500 | 
 + ------ + 
30
dexter

どのデータベースを指定していないのか、MySQLでできること

SELECT column FROM table ORDER BY column DESC LIMIT 7,10;

最初の7をスキップし、次に10の最高を取得します。

8
Pieter

再度、データベースを修正する必要があるかもしれませんが、値が重複している可能性のあるデータセットの上位2番目の値が必要な場合は、グループも実行する必要があります。

SELECT column 
FROM table 
WHERE column IS NOT NULL 
GROUP BY column 
ORDER BY column DESC 
LIMIT 5 OFFSET 2;

最初の2つをスキップすると、次の5つが最高になります。

6

純粋なSQL(注:DBMSに固有のSQL機能を使用することをお勧めします。DBMSの方が効率的である可能性が高いためです)。これにより、n + 1番目に大きい値が取得されます(最小にするには、<を反転します)。重複している場合は、COUNT(DISTINCT VALUE)にします。

select id from table order by id desc limit 4 ;
+------+
| id   |
+------+
| 2211 | 
| 2210 | 
| 2209 | 
| 2208 | 
+------+


SELECT yourvalue
  FROM yourtable t1
 WHERE EXISTS( SELECT COUNT(*)
                 FROM yourtable t2
                WHERE t1.id       <> t2.id
                  AND t1.yourvalue < t2.yourvalue
               HAVING COUNT(*) = 3 )


+------+
| id   |
+------+
| 2208 | 
+------+
5
Matt Rogish

(テーブル名=学生、列名=マーク)

select * from(select row_number() over (order by mark desc) as t,mark from student group by mark) as td where t=4
3
German Alex

次のクエリを使用して、列のn番目に大きい値を見つけることができます。

SELECT * FROM TableName a WHERE
    n = (SELECT count(DISTINCT(b.ColumnName)) 
    FROM TableName b WHERE a.ColumnName <=b.ColumnName);
2
Select max(sal) 
from table t1 
where N (select max(sal) 
        from table t2 
        where t2.sal > t1.sal)

N番目の最大salを見つけます。

1
Piyush
select column_name from table_name 
order by column_name desc limit n-1,1;

ここで、n = 1、2、3、.... n番目の最大値。

1
rashedcs

Oracleのメソッドを次に示します。この例では、9番目に高い値が取得されます。 9を、探している位置を含むバインド変数に置き換えるだけです。

   select created from (
     select created from (
       select created from user_objects
         order by created desc
       )
       where rownum <= 9
       order by created asc
     )
     where rownum = 1

N番目の一意の値が必要な場合は、最も内側のクエリブロックにDISTINCTを追加します。

1
Dave Costa

自分で答えを探しているときにこの質問を掘り下げただけで、これはSQL Server 2005で機能するようです( Blorgbeardのソリューション から派生):

_SELECT MIN(q.col1) FROM (
    SELECT
        DISTINCT TOP n col1
        FROM myTable
        ORDER BY col1 DESC
) q;
_

事実上、それはSELECT MIN(q.someCol) FROM someTable qであり、_SELECT DISTINCT..._クエリによって取得されたテーブルのトップnを持ちます。

1
Phil H

これは、列からn番目の最高値を取得するためのクエリです。

 SELECT * FROM TableName
 WHERE ColomnName<(select max(ColomnName) from TableName)-n order by ColomnName desc limit 1;
SELECT * FROM tablename 
WHERE columnname<(select max(columnname) from tablename) 
order by columnname desc limit 1
1
shankar

MySQL:

select distinct(salary) from employee order by salary desc limit (n-1), 1;
0
Ritesh

(TableName = Student、ColumnName = Mark):

select *
from student 
where mark=(select mark 
            from(select row_number() over (order by mark desc) as t,
                 mark 
                 from student group by mark) as td 
            where t=2)
0
German Alex

以下のクエリはOracle SQLで完璧に機能すると思います...自分でテストしました..

このクエリに関連する情報:このクエリは、employeeおよびdepartmentという名前の2つのテーブルを使用し、従業員の列にname(従業員名)、dept_id(従業員と部署に共通)、salary

部門テーブルの列:dept_id(従業員テーブルにも共通)、dept_name

SELECT
  tab.dept_name,MIN(tab.salary) AS Second_Max_Sal FROM (
    SELECT e.name, e.salary, d.dept_name, dense_rank() over (partition BY  d.dept_name          ORDER BY e.salary)  AS   rank FROM department d JOIN employee e USING (dept_id) )  tab
 WHERE
   rank  BETWEEN 1 AND 2
 GROUP BY
   tab.dept_name

ありがとう

0
ria

SQL Serverの特定の列のN番目の最大値を見つけるためのソリューション:

従業員表:

Employee Table

売上表:

Sales Table

従業員表データ:

==========
Id  name
=========
6   ARSHAD M
7   Manu
8   Shaji

売上表データ:

=================
id  emp_id   amount
=================
1   6        500
2   7        100
3   8        100
4   6        150
5   7        130
6   7        130
7   7        330

売上が最も高い従業員の詳細を検索するクエリ/ [〜#〜] n [〜#〜]販売員が最高

select * from (select E.Id,E.name,SUM(S.amount) AS 'total_amount' from employee E INNER JOIN Sale S on E.Id=S.emp_id group by S.emp_id,E.Id,E.name ) AS T1 WHERE(0)=( select COUNT(DISTINCT(total_amount)) from(select E.Id,E.name,SUM(S.amount) AS 'total_amount' from employee E INNER JOIN Sale S on E.Id=S.emp_id group by S.emp_id,E.Id,E.name )AS T2 WHERE(T1.total_amount<T2.total_amount) );

WHERE(0)では、0をn-1に置き換えます

結果:

========================
id  name    total_amount
========================
7   Manu    690
0
ARSHAD M

このように単純化できます

SELECT MIN(Sal) FROM TableName
WHERE Sal IN
(SELECT TOP 4 Sal FROM TableName ORDER BY Sal DESC)

Salに重複した値が含まれている場合は、これを使用します

SELECT MIN(Sal) FROM TableName
WHERE Sal IN
(SELECT distinct TOP 4 Sal FROM TableName ORDER BY Sal DESC)

4はn番目の値になります。5や6などの最高値でもかまいません。

0
user3844776
Select min(fee) 
from fl_FLFee 
where fee in (Select top 4 Fee from fl_FLFee order by 1 desc)

Nで4番を変更します。

0
user3110552
select sal,ename from emp e where
 2=(select count(distinct sal) from emp  where e.sal<=emp.sal) or
 3=(select count(distinct sal) from emp  where e.sal<=emp.sal) or
 4=(select count(distinct sal) from emp  where e.sal<=emp.sal) order by sal desc;
0
Ankush

PostgreSQLで、EmployeeテーブルからN番目に大きい給与を検索します。

SELECT * FROM Employee WHERE salary in 
(SELECT salary FROM Employee ORDER BY salary DESC LIMIT N) 
ORDER BY salary ASC LIMIT 1;
0

mysql queryn番目の最大給与フォーム従業員テーブルを見つけたいと仮定します

select salary 
form employee
order by salary desc
limit n-1,1 ;
0
mjp

テーブルSalaryにN番目のMAX Employeeを持つ従業員の詳細を取得するための単純なSQLクエリ

sql> select * from Employee order by salary desc LIMIT 1 OFFSET <N - 1>;

テーブル構造を次のように考慮してください:

従業員(id [int主キーauto_increment]、名前[varchar(30)]、給与[int]);

例:

上記の表で3番目のMAX給与が必要な場合、クエリは次のようになります。

sql> select * from Employee order by salary desc LIMIT 1 OFFSET 2;

同様に:

上記の表で8番目のMAX給与が必要な場合、クエリは次のようになります。

sql> select * from Employee order by salary desc LIMIT 1 OFFSET 7;

注:NthMAX値を取得する必要がある場合、OFFSET(N-1)

これと同様に、昇給の給与の場合に同じ種類の操作を行うことができます。

0
Rahul Raina

SQL Serverでは、次のようにします。

select distinct top n+1 column from table order by column desc

そして、必要なければ最初の値を捨てます。

0
Blorgbeard

分析関数を使用するOracleのもう1つ:

select distinct col1 --distinct is required to remove matching value of column
from 
( select col1, dense_rank() over (order by col1 desc) rnk
  from tbl
)
where rnk = :b1
0
Eugene Patek

sQL 2005の場合:

SELECT col1 from 
     (select col1, dense_rank(col1) over (order by col1 desc) ranking 
     from t1) subq where ranking between 2 and @n
0
JesseG

回答:上から2番目:

select * from (select * from deletetable   where rownum <=2 order by rownum desc) where rownum <=1
0
parveen