合并和聚合两列sql

5lhxktic  于 2021-06-26  发布在  Hive
关注(0)|答案(3)|浏览(335)

我有一张table id , name 以及 score 我正在努力抽取得分最高的用户。每个用户可能有多个条目,因此我希望将分数相加,按用户分组。
我已经调查过了 JOIN 操作,但它们似乎是在有两个单独的表时使用的,而不是一个表的两个“视图”。
问题是如果 id 字段存在,用户将没有 name ,反之亦然。
在以下链接中可以找到一个最小的示例:http://sqlfiddle.com/#!2011年9月29日
基本上,我有以下数据:

id    name    score
---   -----   ------
1     ''      15
4     ''      20
NULL  'paul'   8
NULL  'paul'  11
1     ''      13
4     ''      17
NULL  'simon'  9
NULL  'simon' 12

最后我想说的是:

id/name     score
--------    ------
4           37
1           28
'simon'     21
'paul'      19

我可以分组 id 很容易,但它将空值视为单个字段,而实际上它们是两个独立的用户。 SELECT id, SUM(score) AS total FROM posts GROUP BY id ORDER by total DESC; ```
id score


NULL 40
4 37
1 28

提前谢谢。
更新
此查询的目标环境位于配置单元中。下面是查询和输出,只查看 `id` 字段:

hive> SELECT SUM(score) as total, id FROM posts WHERE id is not NULL GROUP BY id ORDER BY total DESC LIMIT 10;
...
OK
29735 87234
20619 9951
20030 4883
19314 6068
17386 89904
13633 51816
13563 49153
13386 95592
12624 63051
12530 39677

运行下面的查询会得到完全相同的输出:

hive> select coalesce(id, name) as idname, sum(score) as total from posts group by coalesce(id, name) order by total desc limit 10;

使用新的计算列名运行以下查询 `idname` 给出一个错误:

hive> select coalesce(id, name) as idname, sum(score) as total from posts group by idname order by total desc limit 10;
FAILED: SemanticException [Error 10004]: Line 1:83 Invalid table alias or column reference 'idname': (possible column names are: score, id, name)

quhf5bfb

quhf5bfb1#

SELECT new_id, SUM(score) FROM 
    (SELECT coalesce(id,name) new_id, score FROM posts)o 
GROUP BY new_id ORDER by total DESC;
kcrjzv8t

kcrjzv8t2#

你的 id 看起来是数字。在某些数据库中,使用 coalesce() 一个数字和一个字符串可能是一个问题。在任何情况下,我都建议对类型进行明确说明:

select coalesce(cast(id as varchar(255)), name) as id_name,
       sum(score) as total
from posts
group by id_name
order by total desc;
qvtsj1bj

qvtsj1bj3#

您可以使用合并来获取任一列的非空值:

SELECT 
    COALESCE(id, name) AS id
    , SUM(score) AS total 
FROM 
    posts 
GROUP BY 
    COALESCE(id, name)
ORDER by total DESC;

相关问题