Belirli bir sütundaki ikinci en büyük tamsayı değerini bulmak için en basit SQL sorgusu nedir?
Sütunda yinelenen değerler olabilir.
Belirli bir sütundaki ikinci en büyük tamsayı değerini bulmak için en basit SQL sorgusu nedir?
Sütunda yinelenen değerler olabilir.
Yanıtlar:
SELECT MAX( col )
FROM table
WHERE col < ( SELECT MAX( col )
FROM table )
T-Sql'de iki yol vardır:
--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'de, söz konusu sütun kümelenmiş olsa bile, ilk yol ikincisinin iki katıdır.
Bunun nedeni, sıralama işleminin, max
toplamanın kullandığı tablo veya dizin taramasına kıyasla nispeten yavaş olmasıdır .
Alternatif olarak, Microsoft SQL 2005 ve sonraki sürümlerde ROW_NUMBER()
işlevi kullanabilirsiniz :
select col
from (
select ROW_NUMBER() over (order by col asc) as 'rowNum', col
from [table] ) withRowNum
where rowNum = 2
Burada hem SQL Server'a özel hem de MySQL'e özel bazı çözümler görüyorum, bu nedenle hangi veritabanına ihtiyacınız olduğunu netleştirmek isteyebilirsiniz. Eğer tahmin etmek zorunda olsaydım SQL Server diyebilirim, çünkü bu MySQL'de önemsiz.
Ayrıca çalışmayan bazı çözümler de görüyorum çünkü çoğaltma olasılığını dikkate almıyorlar, bu yüzden hangilerini kabul ettiğinize dikkat edin. Son olarak, çalışacak birkaç tane görüyorum, ancak bu tablonun iki tam taramasını yapacak. 2. taramanın sadece 2 değere baktığından emin olmak istiyorsunuz.
SQL Server (2012 öncesi):
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
Güncelleme:
SQL Server 2012 artık çok daha temiz (ve standart ) bir OFFSET / FETCH sözdizimini destekliyor :
SELECT TOP 2 [column]
FROM [Table]
GROUP BY [column]
ORDER BY [column] DESC
OFFSET 1 ROWS
FETCH NEXT 1 ROWS ONLY;
n
. Bu test duruyor.
TOP
ve OFFSET
aynı sorguda.
Sanırım şöyle bir şey yapabilirsiniz:
SELECT * FROM Table ORDER BY NumericalColumn DESC LIMIT 1 OFFSET 1
veya
SELECT * FROM Table ORDER BY NumericalColumn DESC LIMIT (1, 1)
veritabanı sunucunuza bağlı olarak. İpucu: SQL Server LIMIT yapmaz.
OFFSET 2
En kolayı, uygulamada bu sonuç kümesinden ikinci değeri elde etmek olacaktır:
SELECT DISTINCT value FROM Table ORDER BY value DESC LIMIT 2
Ancak SQL kullanarak ikinci değeri seçmeniz gerekiyorsa, nasıl olur:
SELECT MIN(value) FROM (SELECT DISTINCT value FROM Table ORDER BY value DESC LIMIT 2) AS t
LIMIT
MySql sözdizimidir, soru bir SQL sürümü belirtmez.
aşağıdaki sorguyu kullanarak sütunun ikinci en büyük değerini bulabilirsiniz
SELECT *
FROM TableName a
WHERE
2 = (SELECT count(DISTINCT(b.ColumnName))
FROM TableName b WHERE
a.ColumnName <= b.ColumnName);
aşağıdaki bağlantıda daha fazla ayrıntı bulabilirsiniz
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
Alt sorgulara gerek yok ... sadece bir satırı atlayın ve siparişten sonra azalan ikinci satırları seçin
SELECT MAX(Salary) FROM Employee WHERE Salary NOT IN (SELECT MAX(Salary) FROM Employee )
Bu sorgu, genel tablodan maksimum maaş içermeyen sonuçtan maksimum maaş döndürür.
Bu çok basit bir kod, bunu deneyebilirsiniz: -
ör .: Tablo adı = test
salary
1000
1500
1450
7500
MSSQL Kodu en yüksek 2. değeri elde etmek için
select salary from test order by salary desc offset 1 rows fetch next 1 rows only;
burada '1 satır öteleme' tablonun 2. satırı anlamına gelir ve 'yalnızca sonraki 1 satırı getir' yalnızca 1 satırı göstermek içindir. 'yalnızca sonraki 1 satırı getir' seçeneğini kullanmazsanız, ikinci satırdaki tüm satırları gösterir.
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
Herhangi bir satır için değer almak için bu yardım umuyoruz .....
Tom, inan, birden fazla değer döndürüldüğünde bunun başarısız olacağını düşün. select max([COLUMN_NAME]) from [TABLE_NAME]
bölümde . yani veri kümesinde 2'den fazla değer olduğunda.
Sorgunuzda hafif bir değişiklik yapılacak -
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
Bu en kolay yoldur:
SELECT
Column name
FROM
Table name
ORDER BY
Column name DESC
LIMIT 1,1
Bahsettiğiniz gibi yinelenen değerler. Bu durumda DISTINCT ve GROUP BY kullanarak ikinci en yüksek değeri bulabilirsiniz
İşte bir tablo
maaş
:
GRUPLA
SELECT amount FROM salary
GROUP by amount
ORDER BY amount DESC
LIMIT 1 , 1
DISTINCT
SELECT DISTINCT amount
FROM salary
ORDER BY amount DESC
LIMIT 1 , 1
LIMIT'in ilk kısmı = başlangıç endeksi
LIMIT'in ikinci kısmı = kaç değer
select max(column_name) from table_name
where column_name not in (select max(column_name) from table_name);
değil , sütun_adı en yüksek değerini hariç tutan bir koşuldur.
Referans: programcı röportajı
Bkz. SQL veritabanı tablosundaki n. Satırı seçme? .
Sybase SQL Anywhere şunları destekler:
SELECT TOP 1 START AT 2 value from table ORDER BY value
select top 1 MyIntColumn from MyTable
where
MyIntColumn <> (select top 1 MyIntColumn from MyTable order by MyIntColumn desc)
order by MyIntColumn desc