it-swarm-vi.tech

Truy vấn để tìm giá trị tối đa thứ n của một cột

Tôi muốn tìm giá trị tối đa thứ 2, thứ 3 của cột

24
kiritsinh parmar

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!

11
TK.

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 | 
 + ------ + 
28
dexter

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.

7
Pieter

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. 

5
Steven Dickinson

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 | 
+------+
4
Matt Rogish

(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
3
German Alex

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);
2
Abhishek B Patel
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.

1
Piyush
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.

1
rashedcs

Đâ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.

1
Dave Costa

Đâ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;
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

(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)
0
German Alex

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 employeedepartment 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

0
ria

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:

Employee Table

Bảng doanh số:

Sales Table

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
0
ARSHAD M

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.

0
user3844776
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.

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

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;
0
Trung Lê Hoàng

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 ;
0
mjp

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ị NthMAX, bạn nên cung cấp OFFSET(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.

0
Rahul Raina

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ó.

0
Blorgbeard

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
0
Eugene Patek

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....

0
Phil H

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
0
JesseG

Trả lời: Thứ hai hàng đầu:

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