2016-11-20 5 views
0

Ich habe eine Tabelle mit float Werte. Ich möchte eine Teilmenge (A) dieser Werte verwenden, um Ränge unter Verwendung von zu erstellen. Dann möchte ich einer zweiten (nicht-schneidenden) Teilmenge (B) von Werten in der Tabelle Ränge auf der Basis der von der ersten Teilmenge (A) abgeleiteten Ränge zuordnen. Einfaches Verbinden von Werten von (B) mit Werten in (A) funktioniert nicht, da die Werte von Teilmenge (B) im Allgemeinen nicht den Werten in Teilmenge (A) entsprechen. In diesem Fall bin ich in Ordnung, entweder einen "nächstliegenden Wert" -Ansatz oder einen "lineare Interpolation" -Ansatz zu verwenden, um die Ränge zu erhalten. Ich bevorzuge Schnelligkeit und Einfachheit, da ich es mit Hunderttausenden von Zeilen zu tun habe.Wie rangiert man einen Datensatz mit einem anderen in SQL?

Hier ist ein konkretes Beispiel (Teilmenge A annehmen, wo Flag = 0 und Teilmenge B, wo Flag = 1):

DECLARE @Data TABLE 
(
    Value FLOAT, 
    Flag BIT 
) 
INSERT INTO @Data SELECT 0.081, 0 
INSERT INTO @Data SELECT 0.831, 0 
INSERT INTO @Data SELECT 0.798, 0 
INSERT INTO @Data SELECT 0.722, 0 
INSERT INTO @Data SELECT 0.322, 0 
INSERT INTO @Data SELECT 0.186, 0 
INSERT INTO @Data SELECT 0.494, 0 
INSERT INTO @Data SELECT 0.757, 0 
INSERT INTO @Data SELECT 0.996, 0 
INSERT INTO @Data SELECT 0.146, 0 
INSERT INTO @Data SELECT 0.514, 1 
INSERT INTO @Data SELECT 0.787, 1 
INSERT INTO @Data SELECT 0.125, 1 
INSERT INTO @Data SELECT 0.324, 1 
INSERT INTO @Data SELECT 0.86, 1 
--Subset A 
SELECT *, 
    Rnk = PERCENT_RANK() OVER (ORDER BY Value) 
FROM @Data 
WHERE Flag = 0 
--Subset B 
SELECT *, 
    Rnk = ?--Ranking based on ranks derived from subset A 
FROM @Data 
WHERE Flag = 1 
+0

Diese [link] (http://sqlmag.com/t-sql/last-non-null-puzzle) endete mir ein Bündel zu einer sehr schnellen Lösung zu helfen. – Joe

Antwort

1

Hmmm. . . Dies ist ein Weg:

with a as (
     select d.* 
      PERCENT_RANK() OVER (ORDER BY Value) as rnk 
     from @Data d 
     where Flag = 0 
    ) 
select b.*, a.rnk 
from @Data b outer join 
    (select top 1 * 
     from a 
     where a.value <= b.value 
     order by a.value desc 
    ) a 
where Flag = 1; 
Verwandte Themen