191

特定の列で 2 番目に大きい整数値を見つけるための最も簡単な SQL クエリは何ですか?

列に重複した値がある可能性があります。

4

46 に答える 46

346
SELECT MAX( col )
  FROM table
 WHERE col < ( SELECT MAX( col )
                 FROM table )
于 2008-08-28T12:43:40.563 に答える
63
SELECT MAX(col) 
FROM table 
WHERE col NOT IN ( SELECT MAX(col) 
                   FROM table
                 );
于 2011-09-09T13:13:56.907 に答える
32

T-Sql には 2 つの方法があります。

--filter out the max
select max( col )
from [table]
where col < ( 
    select max( col )
    from [table] )

--sort top two then bottom one
select top 1 col 
from (
    select top 2 col 
    from [table]
    order by col) topTwo
order by col desc 

Microsoft SQL では、問題の列がクラスター化されている場合でも、最初の方法は 2 番目の方法の 2 倍高速です。

これは、max集計で使用されるテーブルまたはインデックス スキャンと比較して、並べ替え操作が比較的遅いためです。

または、Microsoft SQL 2005 以降では、次のROW_NUMBER()関数を使用できます。

select col
from (
    select ROW_NUMBER() over (order by col asc) as 'rowNum', col
    from [table] ) withRowNum 
where rowNum = 2
于 2008-08-28T13:19:30.587 に答える
25

ここには、SQL Server 固有のソリューションと MySQL 固有のソリューションの両方が表示されているため、必要なデータベースを明確にすることをお勧めします。ただし、これは MySQL では些細なことなので、推測する必要がある場合は SQL Server と言うでしょう。

また、重複の可能性を考慮していないために機能しないソリューションもいくつか見られるため、どのソリューションを受け入れるか注意してください。最後に、機能するものの、テーブルの完全なスキャンが 2 回行われるものをいくつか見つけました。2 回目のスキャンで 2 つの値のみを確認する必要があります。

SQL Server (2012 年より前):

SELECT MIN([column]) AS [column]
FROM (
    SELECT TOP 2 [column] 
    FROM [Table] 
    GROUP BY [column] 
    ORDER BY [column] DESC
) a

MySQL:

SELECT `column` 
FROM `table` 
GROUP BY `column` 
ORDER BY `column` DESC 
LIMIT 1,1

アップデート:

SQL Server 2012 は、よりクリーンな (そして標準の) OFFSET/FETCH 構文をサポートするようになりました。

SELECT [column] 
FROM [Table] 
GROUP BY [column] 
ORDER BY [column] DESC
OFFSET 1 ROWS
FETCH NEXT 1 ROWS ONLY;
于 2008-08-28T14:24:04.143 に答える
17

次のようなことができると思います:

SELECT * 
FROM Table 
ORDER BY NumericalColumn DESC 
LIMIT 1 OFFSET 1

また

SELECT * 
FROM Table ORDER BY NumericalColumn DESC 
LIMIT (1, 1)

データベースサーバーによって異なります。ヒント: SQL Server は LIMIT を行いません。

于 2008-08-28T12:43:25.990 に答える
7

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

SELECT *
FROM TableName a
WHERE
  2 = (SELECT count(DISTINCT(b.ColumnName))
       FROM TableName b WHERE
       a.ColumnName <= b.ColumnName);

次のリンクで詳細を確認できます

http://www.abhishekbpatel.com/2012/12/how-to-get-nth-maximum-and-minimun.html

于 2013-01-23T06:15:57.210 に答える
7

最も簡単な方法は、アプリケーションでこの結果セットから 2 番目の値を取得することです。

SELECT DISTINCT value 
FROM Table 
ORDER BY value DESC 
LIMIT 2

ただし、SQL を使用して 2 番目の値を選択する必要がある場合は、次のようにします。

SELECT MIN(value) 
FROM ( SELECT DISTINCT value 
       FROM Table 
       ORDER BY value DESC 
       LIMIT 2
     ) AS t
于 2008-08-28T12:42:49.207 に答える
6

2 番目に大きい値を見つけるための非常に単純なクエリ

SELECT `Column` 
FROM `Table` 
ORDER BY `Column` DESC 
LIMIT 1,1;
于 2012-10-25T11:01:20.513 に答える
3

これは非常に単純なコードです。これを試すことができます:-

ex : テーブル名 = test

salary 

1000
1500
1450
7500

2 番目に大きい値を取得する MSSQL コード

select salary from test order by salary desc offset 1 rows fetch next 1 rows only;

ここで、「オフセット 1 行」はテーブルの 2 行目を意味し、「次の 1 行のみをフェッチ」はその 1 行のみを表示するためのものです。「次の 1 行のみをフェッチ」を使用しない場合は、2 行目のすべての行が表示されます。

于 2017-06-23T07:46:07.310 に答える
2

select * from (select ROW_NUMBER() over (Order by Col_x desc) as Row, Col_1
    from table_1)as table_new tn inner join table_1 t1
    on tn.col_1 = t1.col_1
where row = 2

これが任意の行の値を取得するのに役立つことを願っています.....

于 2012-06-27T19:04:40.010 に答える
1
select min(sal) from emp where sal in 
    (select TOP 2 (sal) from emp order by sal desc)

ノート

salは列名です
empはテーブル名です

于 2011-08-06T13:17:27.063 に答える
1
select col_name
from (
    select dense_rank() over (order by col_name desc) as 'rank', col_name
    from table_name ) withrank 
where rank = 2
于 2012-03-30T08:40:24.693 に答える
1
SELECT 
    * 
FROM 
    table 
WHERE 
    column < (SELECT max(columnq) FROM table) 
ORDER BY 
    column DESC LIMIT 1
于 2012-10-23T16:13:39.423 に答える
1
select age 
from student 
group by id having age< ( select max(age) 
                          from student 
                        )
order by age 
limit 1
于 2015-02-28T18:16:43.817 に答える
1

これは、列の 2 番目に大きい値を見つける別の方法です。テーブル 'Student' と列 'Age' を考えてみましょう。クエリは次のとおりです。

select top 1 Age 
from Student 
where Age in ( select distinct top 2 Age  
               from Student order by Age desc 
             ) order by Age asc
于 2013-08-15T08:07:54.277 に答える
1

それは最も簡単な方法です:

SELECT
      Column name
FROM
      Table name 
ORDER BY 
      Column name DESC
LIMIT 1,1
于 2013-08-23T18:28:41.323 に答える
1

あなたが言及したように、値が重複しています。このような場合、DISTINCTGROUP BYを使用して 2 番目に高い値を見つけることができます。

ここにテーブルがあります

給料

:

ここに画像の説明を入力

グループ化

SELECT  amount FROM  salary 
GROUP by amount
ORDER BY  amount DESC 
LIMIT 1 , 1

明確

SELECT DISTINCT amount
FROM  salary 
ORDER BY  amount DESC 
LIMIT 1 , 1

LIMIT の最初の部分 = 開始インデックス

LIMIT の 2 番目の部分 = 値の数

于 2016-12-06T16:03:12.227 に答える
1

トム、セクションに複数の値が返された場合、これは失敗すると思いますselect max([COLUMN_NAME]) from [TABLE_NAME]。つまり、データ セットに 3 つ以上の値がある場合です。

クエリを少し変更すると機能します-

select max([COLUMN_NAME]) 
from [TABLE_NAME] 
where [COLUMN_NAME] IN ( select max([COLUMN_NAME]) 
                         from [TABLE_NAME] 
                       )
于 2010-11-25T16:53:19.267 に答える
1
select max(COL_NAME) 
from TABLE_NAME 
where COL_NAME in ( select COL_NAME 
                    from TABLE_NAME 
                    where COL_NAME < ( select max(COL_NAME) 
                                       from TABLE_NAME
                                      )
                   );

subquery は、最大値以外のすべての値を返します。返されたリストから最大値を選択します。

于 2010-11-25T16:58:29.250 に答える
0
select * from emp e where 3>=(select count(distinct salary)
    from emp where s.salary<=salary)

このクエリは、最大3つの給与を選択します。2人の従業員が同じ給与を受け取った場合、これはクエリに影響しません。

于 2009-07-09T05:03:36.937 に答える
0

相関クエリを使用する:

Select * from x x1 where 1 = (select count(*) from x where x1.a < a)
于 2009-09-14T20:21:11.537 に答える
0

Microsoft SQL Server - N 番目に高い値 (エイリアス サブクエリ) に 2 つの TOP を使用します。

2 番目に高い値を求めるには:

SELECT TOP 1 q.* 
FROM (SELECT TOP 2 column_name FROM table_name ORDER BY column_name DESC) as q
ORDER BY column_name ASC;

TOP を 2 回使用しますが、エイリアス サブクエリが必要です。基本的に、内側のクエリは最大の 2 つの値を降順で取得し、次に外側のクエリは昇順で反転して、2 番目に高い値が一番上になるようにします。SELECT ステートメントは、このトップを返します。

n 番目に高い値を解決するには、サブクエリの TOP 値を変更します。例えば:

SELECT TOP 1 q.* 
FROM (SELECT TOP 5 column_name FROM table_name ORDER BY column_name DESC) as q
ORDER BY column_name;

5 番目に高い値を返します。

于 2016-05-23T20:11:48.087 に答える
0
SELECT * FROM EMP
WHERE salary=
        (SELECT MAX(salary) FROM EMP
           WHERE salary != (SELECT MAX(salary) FROM EMP)
        );
于 2013-05-13T07:17:17.497 に答える
0

試す:

select a.* ,b.* from 
(select * from (select ROW_NUMBER() OVER(ORDER BY fc_amount desc) SrNo1, fc_amount as amount1 From entry group by fc_amount) tbl where tbl.SrNo1 = 2) a
,
(select * from (select ROW_NUMBER() OVER(ORDER BY fc_amount asc) SrNo2, fc_amount as amount2  From entry group by fc_amount) tbl where tbl.SrNo2 =2) b
于 2013-09-12T11:40:58.863 に答える
0

行で 2 番目に大きい数値を検索するクエリ-

select Top 1 (salary) from XYZ
where Salary not in (select distinct TOP 1(salary) from XYZ order by Salary desc)
ORDER BY Salary DESC

強調表示Top 1TOP 2に 変更する3か、4u はそれぞれ 3 番目、4 番目、5 番目に高い値を見つけることができます。

于 2013-03-25T06:37:38.823 に答える
0
select top 1 MyIntColumn from MyTable
where
 MyIntColumn <> (select top 1 MyIntColumn from MyTable order by MyIntColumn desc)
order by MyIntColumn desc
于 2008-08-28T12:44:49.513 に答える
0

これは MS SQL で機能します。

select max([COLUMN_NAME]) from [TABLE_NAME] where [COLUMN_NAME] < 
 ( select max([COLUMN_NAME]) from [TABLE_NAME] )
于 2008-08-28T12:45:03.383 に答える
0

このようなもの?ただし、テストしていません。

select top 1 x
from (
  select top 2 distinct x 
  from y 
  order by x desc
) z
order by x
于 2008-08-28T12:45:30.260 に答える
0
select MAX(salary) as SecondMax from test where salary !=(select MAX(salary) from test)
于 2014-04-21T12:20:18.527 に答える
0

SQL データベース テーブルで n 番目の行を選択する方法を参照してください。.

Sybase SQL Anywhere は以下をサポートします。

SELECT TOP 1 START AT 2 value from table ORDER BY value
于 2008-08-28T13:36:14.773 に答える
0
select score 
from table 
where score = (select max(score)-1 from table)
于 2016-03-04T03:57:52.270 に答える
0

次のように、order by 要素と top 1 要素を利用することもできます。

Select  top 1 col_name from table_name
where col_name < (Select top 1 col_name from table_name order by col_name desc)
order by col_name desc 
于 2013-04-23T10:54:26.287 に答える
0

SQL テーブルから最後から 2 番目の行を取得する最も簡単な方法は、と setを使用することです。ORDER BYColumnNameDESCLIMIT 1,1

これを試して:

SELECT * from `TableName` ORDER BY `ColumnName` DESC LIMIT 1,1
于 2017-06-06T07:14:03.680 に答える