2016-06-22 18 views
8

Hi farklı sütunlarından ikinci ve üçüncü büyük değerler Ben sütunlu bir tablo var J1, J2, J3, J4, J5, J 6, J7. Bu sütunlardan en büyük 3 değeri L1, L2, L3 olarak bulmak istiyorum. ilk nasıl bulunacağı, SQL

Ben senin tablo PK varsa

SELECT (
    SELECT Max(v) FROM (
     VALUES 
      ([J1]), ([J2]), 
      ([J3]), ([J4]), 
      ([J5]), ([J6]), 
      ([J7]) 
    ) AS value(v) 
) as [L1]FROM dbo.JTable 
+0

Tabloda bir PK var mı? –

+0

PL/SQL, saklı yordamlar için Oracle'ın dilidir. SQL Server tamamen farklı bir DBMS'dir. Peki ne yapıyorsun? Oracle veya SQL Server? Örneğimizden yola çıkarak, SQL Server ve Oracle değil –

+1

Genel olarak bozuk veri modelinin bir işareti - aynı "tip" in tüm değerleri (iki değeri karşılaştırmak anlamlı, ya da bunların üzerine hesaplamalar anlamlıdır) * bir * sütun. Ve sonra, 1-7 rakamları aslında sütun adlarınıza gömülü olan anlamlı * veri * ise, ek bir sütun olmalıdır. –

cevap

6

, id demek ilk büyük, o zaman bir sorgu kullanabilirsiniz bulmak için aşağıdaki sorguyu çalıştı çalışanların UNPIVOT:

SELECT * 
FROM (
    SELECT *, 
     ROW_NUMBER() OVER (PARTITION BY id ORDER BY Val) AS rn 
    FROM JTable 
    UNPIVOT (
    Val FOR Col IN (J1, J2, J3, J4, J5, J6, J7)) AS unpvt) AS t 
WHERE t.rn <= 3 

Eğer id için bir satır istemek, daha sonra UNPIVOT işlemini geri almak için PIVOT'u kullanabilirsiniz:

SELECT id, [1], [2], [3] 
FROM (
    SELECT id, Val, rn 
    FROM (
    SELECT id, Val, Col, 
      ROW_NUMBER() OVER (PARTITION BY id ORDER BY Val) AS rn 
    FROM JTable 
    UNPIVOT (
     Val FOR Col IN (J1, J2, J3, J4, J5, J6, J7)) AS unpvt) AS t 
    WHERE t.rn <= 3) AS src 
PIVOT (
    MAX(Val) FOR rn IN ([1], [2], [3])) AS pvt 
+0

En iyi 3 değeri almıyor, 53 sütun listesinden en fazla 8 değere sahip olmamız gerektiğinden sorguyu biraz değiştirdim ve 2000'den fazla satır var. Aşağıda, \t \t \t \t SELECT id, [1], [2], [3] 'i kullandım.[7], [8] 'den TEMP6 \t \t \t \t INTO ((id tarafından kimliği, Val, Col, \t \t \t \t ROW_NUMBER() ÜZERİNDE (bölme SEÇİLENDEN \t \t \t \t m, id, Val SEÇ Val DESC SİPARİŞ) \t \t \t \t TEMP5 \t \t \t \t UNPIVOT (Val İÇİN Col İÇİNDE ([Week1] İTİBAREN rn, \t \t \t \t [Week2], [Week3], [Week4] ..... \t \t \t \t t.rn <= 8) olarak, Src olarak \t AS t unpvt OLARAK [Week53] \t \t \t \t))) \t \t \t PIVOT (MAX (Değer) IN rn IN ([1], [2], ..., [7], [8])) AS pvt' –

İlgili konular