列の2番目、3番目、.n番目の最大値を見つけたい
列を降順で並べ替えてから、n番目の行から値を取得できます。
編集::
コメントリクエストごとに更新。 [〜#〜] warning [〜#〜]完全にテストされていません!
SELECT DOB FROM (SELECT DOB FROM USERS ORDER BY DOB DESC) WHERE ROWID = 6
上記のようなものはOracleで動作するはずです...最初に構文を正しく取得する必要があるかもしれません!
給与用の単一の列を持つ次の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 | + ------ +
どのデータベースを指定していないのか、MySQLでできること
SELECT column FROM table ORDER BY column DESC LIMIT 7,10;
最初の7をスキップし、次に10の最高を取得します。
再度、データベースを修正する必要があるかもしれませんが、値が重複している可能性のあるデータセットの上位2番目の値が必要な場合は、グループも実行する必要があります。
SELECT column
FROM table
WHERE column IS NOT NULL
GROUP BY column
ORDER BY column DESC
LIMIT 5 OFFSET 2;
最初の2つをスキップすると、次の5つが最高になります。
純粋な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 |
+------+
(テーブル名=学生、列名=マーク)
select * from(select row_number() over (order by mark desc) as t,mark from student group by mark) as td where t=4
次のクエリを使用して、列のn番目に大きい値を見つけることができます。
SELECT * FROM TableName a WHERE
n = (SELECT count(DISTINCT(b.ColumnName))
FROM TableName b WHERE a.ColumnName <=b.ColumnName);
Select max(sal)
from table t1
where N (select max(sal)
from table t2
where t2.sal > t1.sal)
N番目の最大salを見つけます。
select column_name from table_name
order by column_name desc limit n-1,1;
ここで、n = 1、2、3、.... n番目の最大値。
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を追加します。
自分で答えを探しているときにこの質問を掘り下げただけで、これは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を持ちます。
これは、列から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
MySQL:
select distinct(salary) from employee order by salary desc limit (n-1), 1;
(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)
以下のクエリは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
ありがとう
SQL Serverの特定の列のN番目の最大値を見つけるためのソリューション:
従業員表:
売上表:
従業員表データ:
==========
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
このように単純化できます
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などの最高値でもかまいません。
Select min(fee)
from fl_FLFee
where fee in (Select top 4 Fee from fl_FLFee order by 1 desc)
Nで4番を変更します。
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;
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;
mysql query:n番目の最大給与フォーム従業員テーブルを見つけたいと仮定します
select salary
form employee
order by salary desc
limit n-1,1 ;
テーブル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;
注:Nth
MAX
値を取得する必要がある場合、OFFSET
を(N-1)。
これと同様に、昇給の給与の場合に同じ種類の操作を行うことができます。
SQL Serverでは、次のようにします。
select distinct top n+1 column from table order by column desc
そして、必要なければ最初の値を捨てます。
分析関数を使用する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
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
回答:上から2番目:
select * from (select * from deletetable where rownum <=2 order by rownum desc) where rownum <=1