Как получить среднее время (7) в sql Server query [duplicate]

Сначала из ?merge:

Строки в двух кадрах данных, которые соответствуют указанным столбцам, извлекаются и объединяются вместе. Если есть более одного совпадения, все возможные совпадения вносят по одной строке каждый .

Используя вашу ссылку в комментариях:

url    <- "http://koeppen-geiger.vu-wien.ac.at/data/KoeppenGeiger.UScounty.txt"
koppen <- read.table(url, header=T, sep="\t")
nrow(koppen)
# [1] 3594
length(unique(koppen$FIPS))
# [1] 2789

Таким образом, четко koppen дублирует коды FIPS. Рассматривая набор данных и веб-сайт, кажется, что многие из округов находятся в более чем одном климатическом классе, поэтому, например, в графстве Анкорадж, Аляска имеет три климатических класса:

koppen[koppen$FIPS==2020,]
#     STATE    COUNTY FIPS CLS  PROP
# 73 Alaska Anchorage 2020 Dsc 0.010
# 74 Alaska Anchorage 2020 Dfc 0.961
# 75 Alaska Anchorage 2020  ET 0.029

Решение зависит на то, что вы пытаетесь выполнить. Если вы хотите извлечь все строки в all с любым FIPS, который появляется в koppen, любой из них должен работать:

merge(all,unique(koppen$FIPS))

all[all$FIPS %in% unique(koppen$FIPS),]

Если вам нужно добавить имя графства и состояния в all, используйте это:

merge(all,unique(koppen[c("STATE","COUNTY","FIPS")]),by="FIPS")

EDIT На основе обмена ниже в комментариях.

Итак, поскольку в koppen есть несколько строк с тем же FIPS, но разные CLS, нам нужен способ решить, какую из строк (например, которые CLS) выбрать. Вот два способа:

# this extracts the row with the largest value of PROP, for that FIPS
url        <- "http://koeppen-geiger.vu-wien.ac.at/data/KoeppenGeiger.UScounty.txt"
koppen     <- read.csv(url, header=T, sep="\t")
koppen     <- with(koppen,koppen[order(FIPS,-PROP),])
sub.koppen <- aggregate(koppen,by=list(koppen$FIPS),head,n=1)
result     <- merge(all, sub.koppen, by="FIPS")

# this extracts a row at random
sub.koppen <- aggregate(koppen,by=list(koppen$FIPS), 
                        function(x)x[sample(1:length(x),1)])
result     <- merge(all, sub.koppen, by="FIPS")
8
задан JaJ 3 August 2012 в 04:20
поделиться

4 ответа

Вы можете использовать DateDiff( ms, '00:00:00', e.Duration ) для преобразования времени в целое число миллисекунд. Используйте это для своей совокупности, а затем преобразуйте результат обратно, например. Cast( DateAdd( ms, 1234, '00:00:00' ) as Time ).

12
ответ дан HABO 26 August 2018 в 00:41
поделиться

Дополнение к ответам HABO и Rafi.

Для моего случая мне пришлось указать значение DATEDIFF для bigint, потому что мое значение стало слишком большим и вызвало ошибку арифметического переполнения.

CAST(DATEADD( ms,AVG(CAST(DATEDIFF( ms, '00:00:00', ISNULL(e.Duration, '00:00:00')) as bigint)), '00:00:00' )  as TIME) as 'avg_time'
1
ответ дан Hammafer 26 August 2018 в 00:41
поделиться

Ну, похоже, time является недопустимым типом для метода avg(). Обратитесь к здесь за список допустимых типов данных.

Кроме того, кажется, что вам нужна группа значений для этого, что отрицает необходимость в top 10 с вашим текущим запросом.

1
ответ дан Nick Rolando 26 August 2018 в 00:41
поделиться

Улучшение ответа HABO:

select top 10
Cast(DateAdd( ms,avg(DateDiff( ms, '00:00:00', e.Duration)), '00:00:00' )  as time) as 'avg duration' 
from TimeTable e
8
ответ дан Rafi 26 August 2018 в 00:41
поделиться
Другие вопросы по тегам:

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