Подсчет строк, соответствующих критериям относительно текущей строки

Надеюсь, я правильно понимаю ваш вопрос, но я просто смутился с этим. Наша настройка на моей работе - это Windows Server 2008 R2 с IIS 7.

У нас есть сервер печати, также установленный в том же поле (не уверен, имеет ли это значение, поскольку это не моя область эксперта).

В принципе, просмотр установленных принтеров с помощью PrinterSettings.InstalledPrinters я смог увидеть все имена принтеров, установленные на сервере.

Я прикладываю отладчик к процессу приложения для отладки, и я могу просто использовать отладчик, чтобы увидеть это, иначе вам придется запустить цикл для печати через них. Если вы запустите это локально, вы увидите только принтеры, установленные на вашем компьютере. Если это сетевые принтеры, то будет показан полный путь. Поэтому определите путь / имя, на котором сервер будет распознавать принтер, а затем задайте это имя принтера явно, используя свойство

PrinterSettings.PrinterName класса PrintDocument. Это сработало для меня. Кроме того, для моего идентификатора пула приложений установлено значение NetworkService.

4
задан Diego 6 March 2019 в 18:02
поделиться

2 ответа

Сначала я неправильно понял вопрос, и я думаю, что подход @ Уве - это путь. В своем первом ответе я использовал data.table, чтобы идентифицировать группы (и сколько строк в группе) последовательных дат на id, очевидно, не то, что вы ищете.

Вот также короткий фрагмент sqldf, дополняющий подход @ Uwe (хотя и не такой адекватный, так как здесь порядок строк не сохраняется - это потребует некоторой дополнительной обработки):

library(sqldf)

df <- sqldf('SELECT id, start, end, COUNT(*) as overlappingRows FROM (SELECT df.* FROM df 
            LEFT OUTER JOIN df AS df2 
            ON df.id = df2.id AND df.start <= df2.end AND df.end >= df2.start) as origdf 
            GROUP BY id, start, end')

Вывод:

       id      start        end overlappingRows
1   27677 2018-03-01 2018-05-29               2
2   27677 2018-04-12 2018-04-26               2
3   74744 2016-10-03 2016-11-05               1
4  111111 2018-01-01 2018-01-31               1
5  111111 2018-11-11 2018-12-31               1
6  174095 2018-12-01 2018-12-20               2
7  174095 2018-12-19 2018-12-31               2
8  210610 2018-04-13 2018-09-27               1
9  227156 2018-12-19 2018-12-31               1
10 303693 2017-02-20 2017-04-09               1
11 370474 2017-07-13 2017-08-19               1
0
ответ дан arg0naut91 6 March 2019 в 18:02
поделиться

Изменить 2019-03-07, чтобы справиться с расширенным набором данных OP

Это можно решить путем агрегирования в неэквивалентном самосоединении

library(data.table)
# coerce character dates to IDate class
cols <- c("start", "end")
setDT(df)[, (cols) := lapply(.SD, as.IDate), .SDcols = cols]
# non-equi self-join and aggregate
tmp <- df[df, on = .(id, start <= end, end >= start), .N, by = .EACHI]
# append counts to original dataset
df[, overlapping.rows := tmp$N]
df
        id      start        end overlapping.rows
 1: 174095 2018-12-19 2018-12-31                2
 2: 227156 2018-12-19 2018-12-31                1
 3: 210610 2018-04-13 2018-09-27                1
 4:  27677 2018-04-12 2018-04-26                2
 5: 370474 2017-07-13 2017-08-19                1
 6: 303693 2017-02-20 2017-04-09                1
 7:  74744 2016-10-03 2016-11-05                1
 8: 174095 2018-12-01 2018-12-18                2
 9:  27677 2018-03-01 2018-05-29                2
10: 111111 2018-01-01 2018-01-31                1
11: 111111 2018-11-11 2018-12-31                1
12: 174095 2018-11-30 2018-12-25                3

Используя , связывающий код, можно написать более компактным, но и более запутанным способом:

library(data.table)
cols <- c("start", "end")
setDT(df)[, (cols) := lapply(.SD, as.IDate), .SDcols = cols][
  , overlapping.rows := df[df, on = .(id, start <= end, end >= start), .N, by = .EACHI]$N][]
[1122 ] Обратите внимание, что часть для добавления результатов к оригиналу df основана на комментарии Фрэнка .


Моя первоначальная попытка использовать второе объединение для добавления результатов к исходному df потерпела неудачу в том случае, если есть разные значения для того же id, что и , указанного в OP . Это можно исправить, включив номер строки во второе объединение:

library(data.table)
# coerce character dates to IDate class
cols <- c("start", "end")
setDT(df)[, (cols) := lapply(.SD, as.IDate), .SDcols = cols]
# append row number
tmp <- df[, rn := .I][
  # non-equi self-join and aggregate
  df, on = .(id, start <= end, end >= start), .(rn = i.rn, .N), by = .EACHI]
# append counts to original dataset by joining on row number
df[tmp, on = "rn", overlapping.rows := N][, rn := NULL]
df
        id      start        end overlapping.rows
 1: 174095 2018-12-19 2018-12-31                2
 2: 227156 2018-12-19 2018-12-31                1
 3: 210610 2018-04-13 2018-09-27                1
 4:  27677 2018-04-12 2018-04-26                2
 5: 370474 2017-07-13 2017-08-19                1
 6: 303693 2017-02-20 2017-04-09                1
 7:  74744 2016-10-03 2016-11-05                1
 8: 174095 2018-12-01 2018-12-18                2
 9:  27677 2018-03-01 2018-05-29                2
10: 111111 2018-01-01 2018-01-31                1
11: 111111 2018-11-11 2018-12-31                1
12: 174095 2018-11-30 2018-12-25                3

Объяснение

Условие соединения в соединении без равенства выполняет трюк. Два интервала не перекрываются , если первый заканчивается до начала второго или первый интервал начинается после окончания второго интервала,

e 1 < s 2 ИЛИ e 2 < s 1

Теперь, если два интервала действительно пересекаются / перекрываются, то противоположное из вышеприведенного должно быть истинным. Отрицая и применяя закон Де Моргана , мы получаем условия

s 2 = e 1 И e 2 ]> = s 1

, которые используются в неравных объединениях .

Данные

Расширенный набор данных OP, как описано в РЕДАКТИРОВАНИИ ОП 2019-03-06:

library(data.table)
df <- fread("id     start     end
174095 2018-12-19 2018-12-31
227156 2018-12-19 2018-12-31
210610 2018-04-13 2018-09-27
27677  2018-04-12 2018-04-26
370474 2017-07-13 2017-08-19
303693 2017-02-20 2017-04-09
74744  2016-10-03 2016-11-05
174095 2018-12-01 2018-12-18
27677  2018-03-01 2018-05-29
111111 2018-01-01 2018-01-31
111111 2018-11-11 2018-12-31
174095 2018-11-30 2018-12-25")
0
ответ дан Uwe 6 March 2019 в 18:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: