2016-10-10 4 views
0

Ich erstelle eine R Sweave-Datei, die einen PDF-Bericht zum Testen von Daten aus einer Software erstellt. Die Daten werden meist aus einer SQL Server-Tabelle gezogen, die etwa wie folgt aussieht:Ermitteln des zweithöchsten Werts anstelle des Maximalwerts "-1"

| FileName | Version | Category | Value |   Date  | TestNum | 
|:--------:|:-------:|:--------:|:-----:|:-------------------:|:-------:| 
| File1 | 1.0.12 | Run Time | 74 | 2016-10-01 12:00:00 | 1  | 
| File1 | 1.0.12 | Totals | 468 | 2016-10-01 12:00:00 | 1  | 
| File1 | 1.0.12 | DB Size | 589 | 2016-10-01 12:00:00 | 1  | 
| File2 | 1.0.12 | Run Time | 81 | 2016-10-01 12:00:00 | 1  | 
| File2 | 1.0.12 | Totals | 351 | 2016-10-01 12:00:00 | 1  | 
| File2 | 1.0.12 | DB Size | 625 | 2016-10-01 12:00:00 | 1  | 
| File1 | 1.0.15 | Run Time | 74 | 2016-10-01 12:00:00 | 2  | 
| File1 | 1.0.15 | Totals | 468 | 2016-10-01 12:00:00 | 2  | 
| File1 | 1.0.15 | DB Size | 589 | 2016-10-01 12:00:00 | 2  | 
| File2 | 1.0.15 | Run Time | 81 | 2016-10-01 12:00:00 | 2  | 
| File2 | 1.0.15 | Totals | 351 | 2016-10-01 12:00:00 | 2  | 
| File2 | 1.0.15 | DB Size | 625 | 2016-10-01 12:00:00 | 2  | 
| File1 | 1.0.17 | Run Time | 74 | 2016-10-01 12:00:00 | 3  | 
| File1 | 1.0.17 | Totals | 468 | 2016-10-01 12:00:00 | 3  | 
| File1 | 1.0.17 | DB Size | 589 | 2016-10-01 12:00:00 | 3  | 
| File2 | 1.0.17 | Run Time | 81 | 2016-10-01 12:00:00 | 3  | 
| File2 | 1.0.17 | Totals | 351 | 2016-10-01 12:00:00 | 3  | 
| File2 | 1.0.17 | DB Size | 625 | 2016-10-01 12:00:00 | 3  | 
| File1 | 1.0.21 | Run Time | 74 | 2016-10-01 12:00:00 | 4  | 
| File1 | 1.0.21 | Totals | 468 | 2016-10-01 12:00:00 | 4  | 
| File1 | 1.0.21 | DB Size | 589 | 2016-10-01 12:00:00 | 4  | 
| File2 | 1.0.21 | Run Time | 81 | 2016-10-01 12:00:00 | 4  | 
| File2 | 1.0.21 | Totals | 351 | 2016-10-01 12:00:00 | 4  | 
| File2 | 1.0.21 | DB Size | 625 | 2016-10-01 12:00:00 | 4  | 

ich die TestNum Spalte verwenden, um es schrittweise zu erleichtern, um die Versionen zu zählen, da sie Strings sind. Also hatte ich in meinem R-Skript eine Sektion, die die neueste Version und die vorhergehende finden sollte.

Es gibt jedoch Zeiten, in denen eine Version der Software extrem fehlerhaft war und bei jedem Test abstürzte. Dies ist nicht sehr nützlich in den Charts zu sehen, so dass ich nur eine Zeile in der SQL-Datenbank hinzufügen, dass ich es filtern, verwenden, dann endet die R Datenrahmen wie folgt aufzublicken:

| FileName | Version | Category | Value |   Date  | TestNum | 
|:--------:|:-------:|:--------:|:-----:|:-------------------:|:-------:| 
| File1 | 1.0.12 | Run Time | 74 | 2016-10-01 12:00:00 | 1  | 
| File1 | 1.0.12 | Totals | 468 | 2016-10-01 12:00:00 | 1  | 
| File1 | 1.0.12 | DB Size | 589 | 2016-10-01 12:00:00 | 1  | 
| File2 | 1.0.12 | Run Time | 81 | 2016-10-01 12:00:00 | 1  | 
| File2 | 1.0.12 | Totals | 351 | 2016-10-01 12:00:00 | 1  | 
| File2 | 1.0.12 | DB Size | 625 | 2016-10-01 12:00:00 | 1  | 
| File1 | 1.0.15 | Run Time | 74 | 2016-10-01 12:00:00 | 2  | 
| File1 | 1.0.15 | Totals | 468 | 2016-10-01 12:00:00 | 2  | 
| File1 | 1.0.15 | DB Size | 589 | 2016-10-01 12:00:00 | 2  | 
| File2 | 1.0.15 | Run Time | 81 | 2016-10-01 12:00:00 | 2  | 
| File2 | 1.0.15 | Totals | 351 | 2016-10-01 12:00:00 | 2  | 
| File2 | 1.0.15 | DB Size | 625 | 2016-10-01 12:00:00 | 2  | 
| File1 | 1.0.21 | Run Time | 74 | 2016-10-01 12:00:00 | 4  | 
| File1 | 1.0.21 | Totals | 468 | 2016-10-01 12:00:00 | 4  | 
| File1 | 1.0.21 | DB Size | 589 | 2016-10-01 12:00:00 | 4  | 
| File2 | 1.0.21 | Run Time | 81 | 2016-10-01 12:00:00 | 4  | 
| File2 | 1.0.21 | Totals | 351 | 2016-10-01 12:00:00 | 4  | 
| File2 | 1.0.21 | DB Size | 625 | 2016-10-01 12:00:00 | 4  | 

Aber dann vPrevious ist immer noch auf der Suche nach TestNum == 3 und so bricht das Skript. Gibt es eine Möglichkeit, dass ich stattdessen den zweithöchsten Wert nachschlagen könnte?

BEARBEITEN: Nach Vorschlag, hier ist das, was die Abfrage, die ich verwende, um den Datenrahmen zu erstellen.

df <- sqlQuery(db, "select FileName, Version, Category, Value, Date, TestNum 
       from Table where Comments != 'Do Not Include in R Chart'", 
       stringsAsFactors = F) 
+1

vPrevious <- einzigartig (df [df [ "TestNum"] == Art (unique (df $ TestNum), T) [2], "Version"]) – dww

+0

@dww Das war die Lösung, die ich war auf der Suche nach Danke! – David

+0

@David Ich habe mit Sql nach Ihrer Anfrage aktualisiert. Während Sie die Möglichkeit haben, in Sql und R dasselbe Ergebnis zu erzielen, könnten Sie sich einen Moment Zeit nehmen, um Ergebnisse und Leistung zu vergleichen? Könnte einige interessante Einblicke geben ... Prost –

Antwort

2

Sie könnten versuchen, dense_rank mit order by TestNum

Der Code-Snippet unter Verwendung gibt ein Beispiel für IT-Nutzung ist.

Wenn Sie Ihre Sql-Abfrage zu der Frage hinzufügen können, dann kann es helfen, eine gezieltere Antwort zu geben.

EDIT:

Abgestimmt auf ursprüngliche Abfrage op;

select FileName, Version, Category, Value, Date, TestNum 
from (
    select FileName, Version, Category, Value, Date, TestNum 
     , dense_rank() over (order by [TestNum] desc) as [row_number] 
    from Table 
    where Comments != 'Do Not Include in R Chart' 
    ) t 
where t.[row_number] in (1,2) 
+0

Warum der Downvote zu dieser Antwort? Eine Ranking-Funktion ist * genau * was benötigt wird, um den 2., 3. besten Wert nach einigen Kriterien zu erhalten. –

Verwandte Themen