Wählen Sie die niedrigste ID und berechnen Sie die Abweichung von der niedrigsten

7

Ich versuche eine Ansicht zu erstellen. Ich habe einige Daten in meiner SQL Server-Datenbank und möchte sie nach ihrem mark1und sortieren mark2. Wenn ich sie jetzt sortiere, möchte ich diejenige auswählen mark1, die die niedrigste hat, mark2und berechnen, was die Abweichung von anderen mark1s ist. Die Tabelle sieht jetzt so aus, aber ohne Abweichung.

|   mark1    |    mark2    |      mass    ||    deviation |
|:-----------|------------:|:------------:||:------------:|
| 0001       |      10000  |     10,0     ||    min0001   |
| 0001       |      15000  |     12,0     ||    +20%      |
| 0002       |      11200  |     18,0     ||    min0002   |
| 0002       |      13000  |     35,5     ||    +97.2%    |
| 0002       |      14565  |     85,5     ||    375%      |
| 0003       |      15004  |     15,4     ||    min0003   |
| 0003       |      21250  |     17,4     ||    +12.9%    |
| 0003       |      60764  |     16,4     ||    6.49%     |

Und jetzt, wie Sie sehen, ist es von mark1und bestellt mark2. Nun, mein Problem ist die Abweichungsspalte, ich muss sie nehmen mark1, sagen wir 0001(sein mark2ist 10000) und die niedrigste Masse finden und die Abweichung von anderen finden 0001( 15000). Wie Sie in der Tabelle sehen können.

Flosse
quelle
1
Welche Version von SQL Server verwenden Sie? Die neueren Versionen haben einige Funktionen, die dies viel einfacher machen würden.
Chris Woods
SQL 2014 Version ... Ich hoffe, es hilft ...
FiN
Möchten Sie mit der niedrigsten Masse oder mit der Masse der niedrigsten Marke2 vergleichen?
Ypercubeᵀᴹ

Antworten:

8

FIRST_VALUE (Transact-SQL)

Gibt den ersten Wert in einer geordneten Gruppe von Werten in SQL Server 2014 zurück.

Partition auf mark1und bestellen nach mark2.

So etwas sollte es für Sie tun:

select T.*,
       100 * (T.mass - T.FirstMass) / T.FirstMass as Deviation
from (
     select T.*,
            first_value(T.mass) over(partition by T.mark1 order by T.mark2) as FirstMass
     from dbo.YourTable as T    
     ) as T;

SQL Fiddle

Mikael Eriksson
quelle
2
Mikael hat mich geschlagen :)
Chris Woods
Ja, habe es erkannt und meinen Kommentar entfernt;) Die Daten und Formulierungen legen Ihre Lösung nahe (mit Ausnahme dieser "niedrigsten Masse" müssen sie geklärt werden.)
ypercubeᵀᴹ
1
@ypercube welcher Kommentar :)
Mikael Eriksson
0

Ich denke, diese Abfrage wird die Ergebnisse geben:

SELECT 
    *,
    (t.mass / MIN(mass) OVER (PARTITION BY mark1) - 1) * 100 AS devValue,
    CASE 
        WHEN t.mass = MIN(mass) OVER (PARTITION BY mark1) THEN 'min' + mark1 
        ELSE 
            CASE 
                WHEN t.mass > MIN(mass) OVER (PARTITION BY mark1) THEN '+'
                ELSE '-' 
            END +
            CONVERT(varchar, CONVERT(DECIMAL(10,2), (t.mass / MIN(mass) OVER (PARTITION BY mark1) - 1) * 100)) + '%'
     END AS deviation
FROM
    t
ORDER BY
    t.mark1, t.mark2
shA.t.
quelle