Frage Verwenden Sie den maximalen Spaltenwert in der Reihenfolge nach


Ich versuche, eine Tabelle nach zwei Spalten mit jeweils unterschiedlicher Gewichtung zu sortieren. Das erste ist uptimeDies ist ein Wert zwischen 0 und 1 und hat eine Gewichtung von 0,3. Das zweite ist votes, die eine nicht negative ganze Zahl ist und eine Gewichtung von 0,7 hat.

Die Gewichtung muss mit einem Wert zwischen 0-1 multipliziert werden, also werde ich dies für die Stimmen erhalten, indem ich die Anzahl der Stimmen für jede Reihe durch die maximale Anzahl der Stimmen für jede Reihe dividiere.

Dies ist meine Abfrage bisher, und es funktioniert fast:

SELECT addr
  FROM servers
  ORDER BY (0.3 * uptime) +
           (0.7 * (votes / 100)) DESC

Die 100 ist fest codiert und sollte den Maximalwert von votes. Verwenden MAX(votes) bewirkt, dass die Abfrage nur den Datensatz mit der höchsten Anzahl an Stimmen zurückgibt. Kann dies in einer einzigen Abfrage durchgeführt werden?


5
2017-07-04 13:58


Ursprung


Antworten:


Sie können eine Unterabfrage verwenden, um den Maximalwert von auszuwählen votes

SELECT addr
  FROM servers
  ORDER BY (0.3 * uptime) +
           (0.7 * (votes / (SELECT MAX(votes) FROM servers))) DESC

Beispielgeige Hier.


2
2017-07-04 14:02



Definieren Sie eine Variable und verwenden Sie sie:

DECLARE @maxVotes int
SELECT @maxVotes = MAX(votes) from servers

SELECT addr
  FROM servers
  ORDER BY (0.3 * uptime) +
           (0.7 * (votes / @maxVotes)) DESC

oder verwende eine Unterabfrage in der order by:

SELECT addr
  FROM servers
  ORDER BY (0.3 * uptime) +
           (0.7 * ( votes / (SELECT MAX(votes) FROM servers))) DESC

2
2017-07-04 14:04