Tôi muốn tìm giá trị tối đa thứ 2, thứ 3 của cột
Bạn có thể sắp xếp cột thành định dạng giảm dần và sau đó chỉ cần lấy giá trị từ hàng thứ n.
CHỈNH SỬA::
Cập nhật theo yêu cầu bình luận.CẢNH BÁOchưa được kiểm tra!
SELECT DOB FROM (SELECT DOB FROM USERS ORDER BY DOB DESC) WHERE ROWID = 6
Một cái gì đó giống như ở trên sẽ hoạt động cho Oracle ... trước tiên bạn có thể phải có được cú pháp!
Hãy xem xét bảng Nhân viên sau với một cột duy nhất cho tiền lương.
+ ------ + | Sal | + ------ + | 3500 | | 2500 | | 2500 | | 5500 | | 7500 | + ------ +
Truy vấn sau đây sẽ trả về phần tử Nth Maximum.
select SAL from EMPLOYEE E1 where
(N - 1) = (select count(distinct(SAL))
from EMPLOYEE E2
where E2.SAL > E1.SAL )
Ví dụ. khi giá trị tối đa thứ hai là bắt buộc,
select SAL from EMPLOYEE E1 where
(2 - 1) = (select count(distinct(SAL))
from EMPLOYEE E2
where E2.SAL > E1.SAL )
+ ------ + | Sal | + ------ + | 5500 | + ------ +
Bạn đã không chỉ định cơ sở dữ liệu nào, trên MySQL bạn có thể làm
SELECT column FROM table ORDER BY column DESC LIMIT 7,10;
Sẽ bỏ qua 7 đầu tiên, và sau đó giúp bạn có mười cao nhất tiếp theo.
Một lần nữa bạn có thể cần sửa cho cơ sở dữ liệu của mình, nhưng nếu bạn muốn giá trị thứ 2 hàng đầu trong bộ dữ liệu có khả năng trùng lặp giá trị, bạn cũng sẽ muốn thực hiện một nhóm:
SELECT column
FROM table
WHERE column IS NOT NULL
GROUP BY column
ORDER BY column DESC
LIMIT 5 OFFSET 2;
Sẽ bỏ qua hai cái đầu tiên, và sau đó sẽ giúp bạn có năm cái cao nhất tiếp theo.
SQL thuần túy (lưu ý: Tôi khuyên bạn nên sử dụng các tính năng SQL dành riêng cho DBMS của bạn vì nó sẽ có hiệu quả hơn). Điều này sẽ giúp bạn có giá trị lớn nhất thứ n + 1 (để có giá trị nhỏ nhất, lật <). Nếu bạn có các mục trùng lặp, hãy đặt nó là COUNT (GIÁ TRỊ DISTINCT) ..
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 |
+------+
(Tên bảng = Sinh viên, Tên cột = đánh dấu)
select * from(select row_number() over (order by mark desc) as t,mark from student group by mark) as td where t=4
Bạn có thể tìm thấy giá trị lớn nhất thứ n của cột bằng cách sử dụng truy vấn sau:
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)
Để tìm sal thứ N max.
select column_name from table_name
order by column_name desc limit n-1,1;
trong đó n = 1, 2, 3, .... giá trị tối đa thứ n.
Đây là một phương pháp cho Oracle. Ví dụ này nhận được giá trị cao thứ 9. Chỉ cần thay thế số 9 bằng một biến liên kết có chứa vị trí bạn đang tìm kiếm.
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ếu bạn muốn giá trị duy nhất thứ n, bạn sẽ thêm DISTINCT vào khối truy vấn trong cùng.
Đây là truy vấn để nhận thứ n Cao nhất từ cột đặt n = 0 cho mức cao thứ hai và n = 1 cho mức cao thứ 3, v.v.
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;
(Tên bảng = Sinh viên, Cột Tên = Dấu):
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)
Tôi nghĩ rằng truy vấn dưới đây sẽ hoạt động hoàn hảo trên Oracle sql ... Tôi đã tự mình kiểm tra nó ..
Thông tin liên quan đến truy vấn này: truy vấn này đang sử dụng hai bảng có tên employee
và department
với các cột trong tên nhân viên: name
(tên nhân viên), dept_id
(chung cho nhân viên và bộ phận), salary
Và các cột trong bảng bộ phận: dept_id
(cũng phổ biến cho bảng nhân viên), 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
cảm ơn
Giải pháp tìm giá trị tối đa Nth của một cột cụ thể trong SQL Server:
Bảng nhân viên:
Bảng doanh số:
Dữ liệu bảng nhân viên:
==========
Id name
=========
6 ARSHAD M
7 Manu
8 Shaji
Dữ liệu bảng bán hàng:
=================
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
Truy vấn để tìm hiểu chi tiết về một nhân viên có doanh số cao nhất/Nth
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) );
Trong WHERE (0) thay thế 0 bằng n-1
Kết quả:
========================
id name total_amount
========================
7 Manu 690
Bạn có thể đơn giản hóa như thế này
SELECT MIN(Sal) FROM TableName
WHERE Sal IN
(SELECT TOP 4 Sal FROM TableName ORDER BY Sal DESC)
Nếu Sal chứa các giá trị trùng lặp thì sử dụng giá trị này
SELECT MIN(Sal) FROM TableName
WHERE Sal IN
(SELECT distinct TOP 4 Sal FROM TableName ORDER BY Sal DESC)
4 sẽ là giá trị thứ n, nó có thể có giá trị cao nhất, chẳng hạn như 5 hoặc 6, v.v.
Select min(fee)
from fl_FLFee
where fee in (Select top 4 Fee from fl_FLFee order by 1 desc)
Thay đổi số bốn với N.
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;
Trong PostgreSQL, để tìm mức lương lớn nhất thứ N từ bảng Nhân viên.
SELECT * FROM Employee WHERE salary in
(SELECT salary FROM Employee ORDER BY salary DESC LIMIT N)
ORDER BY salary ASC LIMIT 1;
truy vấn mysql : giả sử tôi muốn tìm hiểu bảng nhân viên mức lương tối đa thứ n
select salary
form employee
order by salary desc
limit n-1,1 ;
Truy vấn SQL đơn giản để có được chi tiết nhân viên có Nth MAX Salary
trong bảng Employee
.
sql> select * from Employee order by salary desc LIMIT 1 OFFSET <N - 1>;
Xem xét cấu trúc bảng như:
Nhân viên ( Id [int key auto auto_increment], Name [varchar (30)], Lương [int]);
Thí dụ:
Nếu bạn cần mức lương MAX
thứ 3 trong bảng trên thì truy vấn sẽ là:
sql> select * from Employee order by salary desc LIMIT 1 OFFSET 2;
Tương tự:
Nếu bạn cần mức lương MAX
thứ 8 trong bảng trên thì truy vấn sẽ là:
sql> select * from Employee order by salary desc LIMIT 1 OFFSET 7;
CHÚ THÍCH: Khi bạn phải nhận giá trị Nth
MAX
, bạn nên cung cấpOFFSET
là (N - 1).
Như thế này bạn có thể thực hiện cùng một loại hoạt động trong trường hợp lương theo thứ tự tăng dần.
Trong SQL Server, chỉ cần làm:
select distinct top n+1 column from table order by column desc
Và sau đó vứt bỏ giá trị đầu tiên, nếu bạn không cần nó.
Một số khác cho Oracle sử dụng các hàm phân tích:
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
Chỉ cần tìm ra câu hỏi này khi tự mình tìm kiếm câu trả lời và điều này dường như hoạt động với SQL Server 2005 (xuất phát từ giải pháp của Blorgbeard ):
SELECT MIN(q.col1) FROM (
SELECT
DISTINCT TOP n col1
FROM myTable
ORDER BY col1 DESC
) q;
Thực tế, đó là một SELECT MIN(q.someCol) FROM someTable q
, với n trên cùng của bảng được truy vấn bằng SELECT DISTINCT...
.
cho 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
Trả lời: Thứ hai hàng đầu:
select * from (select * from deletetable where rownum <=2 order by rownum desc) where rownum <=1