Tablodaki en yüksek ikinci değeri alın


14
id value
1   50
2   60
3   55

select max(value) from tablename;

Genellikle biliyoruz, 60 alacağız, ama bir sonraki 55 değerine ihtiyacım var.

SQL kullanarak 55 değerini nasıl alabilirim?

Yanıtlar:


24

En yüksek değerin yalnızca bir kez oluştuğunu varsayarsak, başka bir yol da kullanmak olacaktır OFFSET(SQL Server 2012 veya üstü):

SELECT * 
FROM tablename
ORDER BY column DESC 
OFFSET 1 ROW 
FETCH NEXT 1 ROW ONLY;

23

Tablodaki en yüksek ikinci farklı değeri elde etmek için

SELECT MIN(value)
FROM   (SELECT DISTINCT TOP (2) value
        FROM   tablename
        ORDER  BY value DESC)T
/*If only one distinct value return nothing. */
HAVING MIN(value) <> MAX(value);

13

Genel bir çözüm aşağıdaki gibi olabilir:

;WITH CTE AS
(
    SELECT
        Col1
        , Col2
        , <AnyColumns>
        , ROW_NUMBER() OVER (ORDER BY <AnyColumns>) AS RowNum
    FROM <YourTable>
    WHERE <YourCondition>
)
SELECT *
FROM CTE
WHERE RowNum = 2 -- Or any condition which satisfies your problem

Burada ayrıca aralığı tanımlayabilirsiniz RowNum >= 10 AND RowNum <= 20. Ve size gerekli tüm sütunları içeren 10. ila 20. satırları verecektir.


7

Her zamanki en iyi numaraya sahipsiniz:

select top 1 *
from (
    select top 2 *
    from my_table
    order by value desc
    ) t 
order by value asc 

Ya da CTE'yi aşağıdaki gibi kullanabilirsiniz:

with CTE as
(
select value, ROW_NUMBER() over(order by value desc) as ord_id
from my_table
)
select value
from CTE
where ord_id = 2

Veya SQLServer'ın son sürümünü (> = 2012) kullanıyorsanız, gecikme işlevi.

SELECT  top 1  lag(value, 1,0) OVER (ORDER BY value)  
FROM my_table
order by value desc

5

Ben böyle yapacağım:

SELECT MAX(value)
FROM tablename
WHERE value < (SELECT MAX(value)
               FROM tablename)

1

ROW_NUMBER()Pencereleme işlevini de kullanabilirsiniz . Hedef değeriniz tarafından sipariş edildiğinde 2. girişi almak istiyorsanız, şunları yapabilirsiniz:

SELECT value 
FROM (
    SELECT 
        ROW_NUMBER() OVER (PARTITION BY NULL ORDER BY value DESC) as RN,
        value
    FROM my_table
) d
WHERE RN = 2

Şimdi en yüksek 2. değeri almak istiyorsanız ve yinelenen değerleriniz varsa, yalnızca farklı değerler elde edebilmeniz için değer girişine göre gruplandırmak isteyebilirsiniz.

SELECT value 
FROM (
    SELECT 
        ROW_NUMBER() OVER (PARTITION BY NULL ORDER BY value DESC) as RN,
        value
    FROM my_table
    GROUP BY value
) d
WHERE RN = 2

En MIN(id)yüksek 2. değere sahip ilk kaydın kimliğini bilmeniz gerekiyorsa (iki 60s ve iki 55s'lik bir veri kümesine sahip olduğunuzu varsayarsak) bu yaklaşımı iç seçime a eklemek için değiştirebilmeniz gerekir.


5
İkinci en yüksek için sadece yerine daha kolay ROW_NUMBER()olan DENSE_RANK()- aynı zamanda ücretsiz için tüm diğer sütunları olsun. Kullanmanıza gerek yok GROUP BY.
ypercubeᵀᴹ
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.