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?
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:
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;
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);
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.
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
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.
ROW_NUMBER()
olanDENSE_RANK()
- aynı zamanda ücretsiz için tüm diğer sütunları olsun. Kullanmanıza gerek yokGROUP BY
.