2016-10-10 4 views
0

Я создаю файл sweave R., который будет компилировать pdf-отчет по тестированию данных из части программного обеспечения. Данные в основном извлекается из таблицы сервера SQL, который выглядит примерно так:Нахождение второго наивысшего значения вместо максимального значения «-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  | 

Я использую столбец TestNum, чтобы сделать его проще постепенно сосчитать версии, так как они являются строками. Поэтому в моем R-скрипте у меня был раздел, который должен был найти последнюю версию и тот, что был до этого.

vLatest <- unique(df[df[,"TestNum"] == max(df$TestNum), "Version"]) 
vPrevious <- unique(df[df[,"TestNum"] == max(df$TestNum)-1, "Version"]) 

Однако есть моменты, когда одна версия программного обеспечения была чрезвычайно глючной и аварийна для каждого теста. Это не очень полезно видеть на графиках, так что я просто добавить строку в базе данных SQL, которые я использую, чтобы отфильтровать его, то R dataframe заканчивает тем, как это:

| 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  | 

Но vPrevious является все еще ищут TestNum == 3, и поэтому сценарий ломается. Есть ли способ, которым я мог бы искать второе по величине значение?

EDIT: По предложению, вот что выглядит запрос, который я использую для создания DataFrame.

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

vPrevious <- уникальный (ДФ [DF [ "TestNum"] == сортировать (уникальный (ДФ $ TestNum), Т) [2], "Version"]) – dww

+0

@dww Это было решение, которое я смотрел спасибо! – David

+0

@David Я обновил Sql в соответствии с вашим запросом. Хотя у вас есть возможность добиться того же результата в Sql и R, вы можете потратить некоторое время, чтобы сравнить результаты и производительность? Могу дать некоторые интересные идеи ... Приветствия –

ответ

2

Вы можете попробовать использовать dense_rank с order by TestNum

Код сниппета ниже приведен пример из его использования.

select c.* 
from (
    select *,dense_rank() over (order by [object_id] desc) as [row_number] 
    from sys.columns 
    ) c 
where c.[row_number] in (1,2) 

Если вы можете добавить свой вопрос Sql к вопросу, это может помочь в предоставлении более целенаправленного ответа.

EDIT:

приспособленное для исходного запроса параметров порядка;

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

Почему нижний предел этого ответа? Функция ранжирования - это * точно * то, что необходимо для получения 2-го, 3-го лучших значений в соответствии с некоторыми критериями. –

Смежные вопросы