标签: aggregate-functions

聚合SQL函数以仅从每个组中获取第一个

我有2个表 - 一个Account表和一个Users表.每个帐户可以有多个用户.我有一个场景,我想对这两个表执行单个查询/连接,但我想要所有的帐户数据(帐户.*)和只有第一组用户数据(特别是他们的名字).

我没有在我的聚合小组上做"最小"或"最大",而是想做一个"第一次".但是,显然,TSQL中没有"First"聚合函数.

有关如何获取此查询的任何建议?显然,很容易获得Account x Users的笛卡尔积:

 SELECT User.Name, Account.* FROM Account, User
 WHERE Account.ID = User.Account_ID
Run Code Online (Sandbox Code Playgroud)

但是我怎样才能根据User.ID的顺序从产品中获取第一个用户?

t-sql sql-server-2005 aggregate-functions

30
推荐指数
4
解决办法
5万
查看次数

SPARK SQL替换mysql GROUP_CONCAT聚合函数

我有一个包含两个字符串类型列(用户名,朋友)的表,对于每个用户名,我想在一行中收集所有朋友,连接为字符串('username1','friends1,friends2,friends3').我知道MySql通过GROUP_CONCAT做到这一点,有没有办法用SPARK SQL做到这一点?

谢谢

aggregate-functions apache-spark apache-spark-sql

30
推荐指数
4
解决办法
3万
查看次数

如何使用聚合函数获取MySQL查询中分组记录的第一个和最后一个记录?

我正在尝试获取"分组"记录的第一个和最后一个记录.
更确切地说,我正在做这样的查询

SELECT MIN(low_price), MAX(high_price), open, close
FROM symbols
WHERE date BETWEEN(.. ..)
GROUP BY YEARWEEK(date)
Run Code Online (Sandbox Code Playgroud)

但我想获得该组的第一个和最后一个记录.它可以通过做大量的请求完成,但我有一个非常大的表.

是否有一个(如果可能的话处理时间很短)用MySQL做这个的方法?

mysql aggregate-functions

29
推荐指数
1
解决办法
7万
查看次数

在聚合查询中计算具有特定条件的行

我有这个查询来获取PlayerSessions 的数量reconnect = TRUE,分组依据Player.country:

SELECT
    country,
    COUNT(*) AS with_reconnect
FROM PlayerSession S LEFT JOIN Player P ON (P.id = S.player_id)
WHERE reconnect = TRUE
GROUP BY country
Run Code Online (Sandbox Code Playgroud)

我想修改它不仅显示重新连接的会话计数,还显示总计数,例如:

SELECT
    country,
    COUNT(*) AS total,
    (COUNT WHERE reconnect = TRUE) AS with_reconnect
FROM PlayerSession S LEFT JOIN Player P ON (P.id = S.player_id)
GROUP BY country
Run Code Online (Sandbox Code Playgroud)

这是可能的,如果是这样,那么正确的语法是什么?

mysql sql count subquery aggregate-functions

29
推荐指数
2
解决办法
4万
查看次数

两个SQL LEFT JOINS产生不正确的结果

我有3张桌子:

users(id, account_balance)
grocery(user_id, date, amount_paid)
fishmarket(user_id, date, amount_paid)
Run Code Online (Sandbox Code Playgroud)

对于具有不同日期和金额的相同user_id,两个fishmarketgrocery表可能有多次出现,或者对于任何给定用户都没有任何内容.当我尝试以下查询时:

SELECT
     t1."id" AS "User ID",
     t1.account_balance AS "Account Balance",
     count(t2.user_id) AS "# of grocery visits",
     count(t3.user_id) AS "# of fishmarket visits"
FROM users t1
LEFT OUTER JOIN grocery t2 ON (t2.user_id=t1."id") 
LEFT OUTER JOIN fishmarket t3 ON (t3.user_id=t1."id") 
GROUP BY t1.account_balance,t1.id
ORDER BY t1.id
Run Code Online (Sandbox Code Playgroud)

它会产生不正确的结果:"1", "12", "12".
但是,当我尝试LEFT JOIN只有一个表时,它会产生正确的结果,无论是访问grocery还是fishmarket访问"1", "3", "4".

我在这做错了什么?
我正在使用PostgreSQL 9.1.

sql postgresql aggregate-functions left-join

29
推荐指数
2
解决办法
2万
查看次数

在postgres中的聚合函数中进行DISTINCT ON

对于我的问题,我们有一个架构,其中一张照片有很多标签和许多评论.因此,如果我有一个查询,我想要所有的注释和标记,它会将行相乘.因此,如果一张照片有2个标签和13条评论,我会为这张照片获得26行:

SELECT
        tag.name, 
        comment.comment_id
FROM
        photo
        LEFT OUTER JOIN comment ON comment.photo_id = photo.photo_id
        LEFT OUTER JOIN photo_tag ON photo_tag.photo_id = photo.photo_id
        LEFT OUTER JOIN tag ON photo_tag.tag_id = tag.tag_id
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

这对大多数事情来说都很好,但这意味着如果我GROUP BY和那时json_agg(tag.*),我得到第一个标签的13个副本和第二个标签的13个副本.

SELECT json_agg(tag.name) as tags
FROM
        photo
        LEFT OUTER JOIN comment ON comment.photo_id = photo.photo_id
        LEFT OUTER JOIN photo_tag ON photo_tag.photo_id = photo.photo_id
        LEFT OUTER JOIN tag ON photo_tag.tag_id = tag.tag_id
GROUP BY photo.photo_id
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

相反,我想要一个只有'郊区'和'城市'的数组,如下所示:

 [
      {"tag_id":1,"name":"suburban"}, 
      {"tag_id":2,"name":"city"}
 ]
Run Code Online (Sandbox Code Playgroud)

我可以json_agg(DISTINCT tag.name),但是当我想要整个行作为json时,这只会产生一个标签名称数组.我想json_agg(DISTINCT ON(tag.name) …

sql postgresql json distinct aggregate-functions

28
推荐指数
4
解决办法
1万
查看次数

无团体计数

我有一个名为GUYS(ID,NAME,PHONE)的表,我需要添加一个有多少人具有相同名称的计数,同时显示所有这些,所以我不能将它们分组.例:

ID NAME  PHONE
1  John  335   
2  Harry 444
3  James 367
4  John  742
5  John  654
Run Code Online (Sandbox Code Playgroud)

想要的输出应该是

ID NAME  PHONE COUNT
1  John  335   3
2  Harry 444   1
3  James 367   1
4  John  742   3
5  John  654   3
Run Code Online (Sandbox Code Playgroud)

我怎么能这样做?我只是设法让很多人有不同的数量.

谢谢

mysql sql aggregate-functions

27
推荐指数
3
解决办法
5万
查看次数

MySQL中的聚合函数 - 列表(如Oracle中的LISTAGG)

我需要函数,它返回字符串列表.

我有这样的表中的数据:

Id    MyString
------------------------
 1    First
 2    Second
 3    Third
 4    Fourth
Run Code Online (Sandbox Code Playgroud)

我需要这样的函数(这样的东西在oracle中工作):

select LISTAGG(MyString, ', ') as myList where id < 4
Run Code Online (Sandbox Code Playgroud)

返回的内容如下:

myList
------------------------
First, Second, Third
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

mysql aggregate-functions

27
推荐指数
1
解决办法
3万
查看次数

Postgres - 将两列聚合成一个项目

我想在分组时将两列聚合成一个"数组".

假设一个像这样的表:

friends_map:
=================================
user_id    friend_id    confirmed
=================================
1          2            true
1          3            false
2          1            true
2          3            true
1          4            false
Run Code Online (Sandbox Code Playgroud)

我想从user_id中选择此表和group并获取friend_id并确认为以逗号分隔的连接值.

目前我有这个:

SELECT user_id, array_agg(friend_id) as friends, array_agg(confirmed) as confirmed
FROM friend_map
WHERE user_id = 1
GROUP BY user_id
Run Code Online (Sandbox Code Playgroud)

这让我:

=================================
user_id    friends      confirmed
=================================
1         [2,3,4]       [t, f, f]
Run Code Online (Sandbox Code Playgroud)

我怎样才能得到:

=================================
user_id    friends     
=================================
1         [ [2,t], [3,f], [4,f] ]
Run Code Online (Sandbox Code Playgroud)

sql arrays postgresql aggregate-functions

27
推荐指数
4
解决办法
2万
查看次数

如何将SUM用于位列?

如何在T-SQL中对位列使用函数SUM()?

当我尝试这样做时,如下所示:

SELECT SUM(bitColumn) FROM MyTable;
Run Code Online (Sandbox Code Playgroud)

我收到错误:

操作数数据类型位对于sum运算符无效.

sql t-sql sql-server aggregate-functions

26
推荐指数
4
解决办法
2万
查看次数