Truy vấn SQL đơn giản nhất để tìm giá trị nguyên lớn thứ hai trong một cột cụ thể là gì?
Có thể có các giá trị trùng lặp trong cột.
Truy vấn SQL đơn giản nhất để tìm giá trị nguyên lớn thứ hai trong một cột cụ thể là gì?
Có thể có các giá trị trùng lặp trong cột.
Câu trả lời:
SELECT MAX( col )
FROM table
WHERE col < ( SELECT MAX( col )
FROM table )
Trong T-Sql có hai cách:
--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
Trong Microsoft SQL, cách thứ nhất nhanh gấp đôi so với cách thứ hai, ngay cả khi cột trong câu hỏi được phân cụm.
Điều này là do hoạt động sắp xếp tương đối chậm so với quét bảng hoặc chỉ mục mà max
tập hợp sử dụng.
Ngoài ra, trong Microsoft SQL 2005 trở lên, bạn có thể sử dụng ROW_NUMBER()
chức năng:
select col
from (
select ROW_NUMBER() over (order by col asc) as 'rowNum', col
from [table] ) withRowNum
where rowNum = 2
Tôi thấy cả một số SQL Server cụ thể và một số giải pháp cụ thể của MySQL ở đây, vì vậy bạn có thể muốn làm rõ cơ sở dữ liệu nào bạn cần. Mặc dù nếu tôi phải đoán tôi sẽ nói SQL Server vì đây là chuyện nhỏ trong MySQL.
Tôi cũng thấy một số giải pháp sẽ không hiệu quả vì chúng không tính đến khả năng trùng lặp, vì vậy hãy cẩn thận với những giải pháp bạn chấp nhận. Cuối cùng, tôi thấy một số sẽ hoạt động nhưng điều đó sẽ thực hiện hai lần quét hoàn chỉnh của bảng. Bạn muốn chắc chắn rằng lần quét thứ 2 chỉ nhìn vào 2 giá trị.
Máy chủ SQL (trước năm 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
Cập nhật:
SQL Server 2012 hiện hỗ trợ cú pháp OFFSET / FETCH sạch hơn (và tiêu chuẩn ):
SELECT TOP 2 [column]
FROM [Table]
GROUP BY [column]
ORDER BY [column] DESC
OFFSET 1 ROWS
FETCH NEXT 1 ROWS ONLY;
n
. Cái này đứng đó kiểm tra.
TOP
và OFFSET
trong cùng một truy vấn.
Tôi cho rằng bạn có thể làm một cái gì đó như:
SELECT * FROM Table ORDER BY NumericalColumn DESC LIMIT 1 OFFSET 1
hoặc là
SELECT * FROM Table ORDER BY NumericalColumn DESC LIMIT (1, 1)
tùy thuộc vào máy chủ cơ sở dữ liệu của bạn. Gợi ý: Máy chủ SQL không làm GIỚI HẠN.
OFFSET 2
Cách dễ nhất là lấy giá trị thứ hai từ tập kết quả này trong ứng dụng:
SELECT DISTINCT value FROM Table ORDER BY value DESC LIMIT 2
Nhưng nếu bạn phải chọn giá trị thứ hai bằng SQL, thì:
SELECT MIN(value) FROM (SELECT DISTINCT value FROM Table ORDER BY value DESC LIMIT 2) AS t
LIMIT
là cú pháp MySql, câu hỏi không chỉ định phiên bản SQL.
bạn có thể tìm giá trị cột lớn thứ hai bằng cách sử dụng truy vấn sau
SELECT *
FROM TableName a
WHERE
2 = (SELECT count(DISTINCT(b.ColumnName))
FROM TableName b WHERE
a.ColumnName <= b.ColumnName);
bạn có thể tìm thêm chi tiết về liên kết sau
http://www.abhishekbpatel.com/2012/12/how-to-get-nth-maximum-and-minimun.html
MSSQL
SELECT *
FROM [Users]
order by UserId desc OFFSET 1 ROW
FETCH NEXT 1 ROW ONLY;
MySQL
SELECT *
FROM Users
order by UserId desc LIMIT 1 OFFSET 1
Không cần truy vấn phụ ... chỉ cần bỏ qua một hàng và chọn hàng thứ hai sau khi đặt hàng bằng cách giảm dần
SELECT MAX(Salary) FROM Employee WHERE Salary NOT IN (SELECT MAX(Salary) FROM Employee )
Truy vấn này sẽ trả về mức lương tối đa, từ kết quả - không chứa mức lương tối đa từ bảng tổng thể.
Đây là mã rất đơn giản, bạn có thể thử điều này: -
ví dụ: Tên bảng = kiểm tra
salary
1000
1500
1450
7500
Mã MSSQL để có giá trị lớn thứ 2
select salary from test order by salary desc offset 1 rows fetch next 1 rows only;
ở đây 'offset 1 hàng' có nghĩa là hàng thứ 2 của bảng và 'chỉ tìm nạp 1 hàng tiếp theo' chỉ để hiển thị 1 hàng đó. nếu bạn không sử dụng 'chỉ tìm nạp 1 hàng tiếp theo' thì nó sẽ hiển thị tất cả các hàng từ hàng thứ hai.
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
Hy vọng điều này sẽ giúp có được giá trị cho bất kỳ hàng .....
Tom, tin rằng điều này sẽ thất bại khi có nhiều hơn một giá trị được trả về trong select max([COLUMN_NAME]) from [TABLE_NAME]
phần. tức là nơi có nhiều hơn 2 giá trị trong tập dữ liệu.
Sửa đổi nhẹ cho truy vấn của bạn sẽ hoạt động -
select max([COLUMN_NAME]) from [TABLE_NAME] where [COLUMN_NAME] **IN**
( select max([COLUMN_NAME]) from [TABLE_NAME] )
SELECT
*
FROM
table
WHERE
column < (SELECT max(columnq) FROM table)
ORDER BY
column DESC LIMIT 1
Đó là cách tuyệt vời nhất:
SELECT
Column name
FROM
Table name
ORDER BY
Column name DESC
LIMIT 1,1
Như bạn đã đề cập các giá trị trùng lặp. Trong trường hợp như vậy, bạn có thể sử dụng DISTINCT và GROUP BY để tìm ra giá trị cao thứ hai
Đây là một cái bàn
lương
:
NHÓM THEO
SELECT amount FROM salary
GROUP by amount
ORDER BY amount DESC
LIMIT 1 , 1
KHOẢNG CÁCH
SELECT DISTINCT amount
FROM salary
ORDER BY amount DESC
LIMIT 1 , 1
Phần đầu tiên của LIMIT = chỉ mục bắt đầu
Phần thứ hai của LIMIT = có bao nhiêu giá trị
select max(column_name) from table_name
where column_name not in (select max(column_name) from table_name);
không phải là một điều kiện loại trừ giá trị cao nhất của cột_name.
Tham khảo: phỏng vấn lập trình viên
Xem Cách chọn hàng thứ n trong bảng cơ sở dữ liệu SQL? .
Sybase SQL mọi nơi hỗ trợ:
SELECT TOP 1 START AT 2 value from table ORDER BY value