我有一个名为gallery的表.对于图库中的每一行,表格图片中有几行.一张图片属于一个图库.然后是表投票.每一行都是某个画廊的upvote或downvote.这是(简化)结构:
gallery ( gallery_id )
picture ( picture_id, picture_gallery_ref )
vote ( vote_id, vote_value, vote_gallery_ref )
Run Code Online (Sandbox Code Playgroud)
现在我想要一个查询给我以下信息:所有画廊都有自己的数据字段和连接到画廊的图片数量以及投票的sumarized值.
这是我的查询,但由于多次加入,聚合值不正确.(至少当图片或投票中有多行时.)
SELECT
*, SUM( vote_value ) as score, COUNT( picture_id ) AS pictures
FROM
gallery
LEFT JOIN
vote
ON gallery_id = vote_gallery_ref
LEFT JOIN
picture
ON gallery_id = picture_gallery_ref
GROUP BY gallery_id
Run Code Online (Sandbox Code Playgroud)
因为我注意到这COUNT( DISTINCT picture_id )
给了我正确数量的照片我试过这个:
( SUM( vote_value ) / GREATEST( COUNT( DISTINCT picture_id ), 1 ) ) AS score
Run Code Online (Sandbox Code Playgroud)
它适用于此示例,但如果一个查询中有更多连接,该怎么办?
只是想知道是否有更好或更"优雅"的方式可以解决这个问题.另外我想知道我的解决方案是MySQL特定的还是标准的SQL?
我一直在读关于堆栈溢出的几篇关于聚合的文章,以及它与委托和组合的比较.主要是:
根据我在这里读到的这篇和其他文章,特许是聚合是一个物体拥有另一个物体,然而,一个物体的死亡并不意味着另一物体的死亡.但是,根据GoF的设计模式:
"聚合意味着聚合对象及其所有者具有相同的生命周期"[第22页底部]
有什么建议吗?
谢谢
我有一个聚合问题,我无法弄清楚如何在R中有效地执行.
说我有以下数据:
group1 <- c("a","b","a","a","b","c","c","c","c",
"c","a","a","a","b","b","b","b")
group2 <- c(1,2,3,4,1,3,5,6,5,4,1,2,3,4,3,2,1)
value <- c("apple","pear","orange","apple",
"banana","durian","lemon","lime",
"raspberry","durian","peach","nectarine",
"banana","lemon","guava","blackberry","grape")
df <- data.frame(group1,group2,value)
Run Code Online (Sandbox Code Playgroud)
我对采样从所述数据帧df
,使得我随机的因素每个组合只挑选单个行group1
和group2
.
如你所见,结果 table(df$group1,df$group2)
1 2 3 4 5 6
a 2 1 2 1 0 0
b 2 2 1 1 0 0
c 0 0 1 1 2 1
Run Code Online (Sandbox Code Playgroud)
表明某些组合不止一次出现,而其他组合从未见过.对于那些被多次看到的人(例如,group1="a"
和group2=3
),我想只随机选择一个相应的行并返回一个只包含该行子集的新数据帧.这样,分组因子的每个可能组合仅由数据帧中的单个行表示.
这里的一个重要方面是我的实际数据集可以包含从500,000行到> 2,000,000行的任何内容,因此注意性能非常重要.
我在R比较新,所以我一直在弄清楚如何正确地生成这个结构.一次尝试看起来像这样(使用plyr
包):
choice <- function(x,label) {
cbind(x[sample(1:nrow(x),1),],data.frame(state=label))
}
df <- ddply(df[,c("group1","group2","value")],
.(group1,group2),
pick_junc,
label="test")
Run Code Online (Sandbox Code Playgroud)
请注意,在这种情况下,我还在名为"label"的数据框中添加了一个额外的列,该列被指定为ddply
函数的额外参数.但是,我在大约20分钟后杀了这个.
在其他情况下,我尝试使用 …
我有一个 group by YEAR(mydate),MONTH(mydate)
我想选择它们作为一个独特的领域
SELECT SUM(Price),YEAR(mydate) + '/' + MONTH(mydate)
FROM MyTable
GROUP BY YEAR(mydate), MONTH(mydate)
Run Code Online (Sandbox Code Playgroud)
或类似的东西.
mydate
是smalldatetime
.
可能吗?
我有以下数据框:
id <- c(1,1,1,1,1,2,2,2,2)
spent <- c(10,10,20,10,10,5,5,5,20)
period <- c("f","c","c","v","v","f","c","c","v")
mean.spent <- c(10,15,15,10,10,5,5,5,20)
df <- data.frame(id,spent,period,mean.spent)
Run Code Online (Sandbox Code Playgroud)
我想要的是汇总每个时期每个Id的平均花费如下:
id f c v
1 10 15 10
2 5 5 20
Run Code Online (Sandbox Code Playgroud)
你能帮我做一下吗?
假设我有这个员工名单:
Dept Date Name
----- --------- ---------------
30 07-DEC-02 Raphaely
30 18-MAY-03 Khoo
40 07-JUN-02 Mavris
50 01-MAY-03 Kaufling
50 14-JUL-03 Ladwig
70 07-JUN-02 Baer
90 13-JAN-01 De Haan
90 17-JUN-03 King
100 16-AUG-02 Faviet
100 17-AUG-02 Greenberg
110 07-JUN-02 Gietz
110 07-JUN-02 Higgins
Run Code Online (Sandbox Code Playgroud)
我想要一个R部门的列表聚合(类似于Oracle PL/SQL的LISTAGG
函数),它将产生最后一列:
Dept Date Name Emp_list
----- --------- --------------- ---------------------------------------------
30 07-DEC-02 Raphaely Raphaely; Khoo
30 18-MAY-03 Khoo Raphaely; Khoo
40 07-JUN-02 Mavris Mavris
50 01-MAY-03 Kaufling Kaufling; Ladwig
50 14-JUL-03 Ladwig …
Run Code Online (Sandbox Code Playgroud) 这可能是一个天真的问题,但我在一组其他变量上运行变量的回归.
但每个国家都有几个观察结果,原始回归有一个合并的样本.现在我想要每个国家的平均值并对平均值进行回归.
例如,我有50个国家,每个国家有3或4个观察.现在我想要按国家/地区平均每个变量.因此,最终每个独立/因变量有50个观测值,每个国家一个.
现在我使用的是aggregate命令,但是它创建了一个带有国家名称和平均值的变量.所以我无法对这些变量进行回归.
这就是我所拥有的
国家/某些观察/一些其他观察/一些其他观察 - 2
索马里/ 3/7 /....
USA/7/8/...
Nigeria/5/8/...
Nigeria/9/2/..
India/4/7/..
India/7/9/..
UK/8/1/..
UK/5/5/..
等等
我使用elasticsearch aggregations
返回两个不同的聚合组,一个用于当前周,一个用于前一周,我当前的周聚合看起来像这样:
"aggregations": {
"current": {
"date_histogram": {
"field": "date",
"interval": "1d",
"min_doc_count": 0,
"extended_bounds": {
"min": new Date().setDate(new Date().getDate() - 7),
"max": new Date().getDate()
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
在这一点上一切都很好,即时使用min_doc_count
,extended_bounds
以填补空桶的空隙,以防万一.
在我的其他聚合上,我几乎以同样的方式重复这个过程,但我希望我的桶能够用于前一个时期!
我知道这extended_bounds
不是过滤桶,因此我想在我的聚合上添加一个过滤器,如下所示:
"aggregations": {
filtered: {
"filter" : {
"bool": {
"must": [{
"range" : {
date: {
from: new Date().setDate(new Date().getDate() - 14),
to: new Date().setDate(new Date().getDate() - 7)
}
}
}]
}
},
},
"previous": {
"date_histogram": {
"field": "date", …
Run Code Online (Sandbox Code Playgroud) 假设您在BigQuery中有以下表格:
A = user1 | 0 0 |
user2 | 0 3 |
user3 | 4 0 |
Run Code Online (Sandbox Code Playgroud)
交叉加入后,你有
dist = |user1 user2 0 0 , 0 3 | #comma is just showing user val seperation
|user1 user3 0 0 , 4 0 |
|user2 user3 0 3 , 4 0 |
Run Code Online (Sandbox Code Playgroud)
如何在BigQuery中执行行聚合以计算跨行的成对聚合.作为典型用例,您可以计算两个用户之间的欧氏距离.我想在两个用户之间计算以下指标:
sum(min(user1_row[i], user2_row[i]) / abs(user1_row[i] - user2_row[i]))
Run Code Online (Sandbox Code Playgroud)
为每对用户总结了所有i.
例如,在Python中,您只需:
for i in np.arange(row_length/2)]):
dist.append([user1, user2, np.sum(min(r1[i], r2[i]) / abs(r1[i] - r2[i]))])
Run Code Online (Sandbox Code Playgroud) 如何median
对已经聚合的数据进行适当的计算?
说我有一个看起来像这样的数据框
> df <- data_frame(name = c("A","B","C","D"), count = c(1,3,5,2), avg = c(100,50,20,10))
> df
# A tibble: 4 × 3
name count avg
<chr> <dbl> <dbl>
1 A 1 100
2 B 3 50
3 C 5 20
4 D 2 10
Run Code Online (Sandbox Code Playgroud)
假设我们对垃圾桶中的东西了解不多,但是假设垃圾桶中的变化很小。据我们所知,我们将像这样排列值:
10 10 20 20 20 20 20 50 50 50 100
Run Code Online (Sandbox Code Playgroud)
在11个值中,中位数将是第6个值,即20
但是,如果我简单地采用median()
,则R会接受4个值:10, 20, 50, 100
> median(df$avg)
[1] 35
Run Code Online (Sandbox Code Playgroud)
这不是我想要的。
如何解决这个问题并“展开”数据集?
aggregation ×10
r ×5
sql ×3
average ×1
cross-join ×1
dataframe ×1
datetime ×1
java ×1
join ×1
median ×1
oracle ×1
plyr ×1
sql-server ×1
statistics ×1
string ×1
text ×1