将 Postgre 查询转换为 Hive/Mysql

Posted

技术标签:

【中文标题】将 Postgre 查询转换为 Hive/Mysql【英文标题】:Convert Postgre query to Hive/ Mysql 【发布时间】:2020-09-16 05:02:36 【问题描述】:

我有这张桌子:

CREATE TABLE football_teams ( player_id text, name text, team text 
);

INSERT INTO football_teams
VALUES
 ('010', 'Messi', 'Barcelona'),
('007', 'Sancho', 'Dortmund'),
('011', 'Werner', 'Chelsea'),
('001', 'De Gea', 'Manchester United'),
('009', 'Lewandowski', 'Bayern Munich'),
('006', 'Pogba', 'Manchester United'),
('017', 'De Bruyne', 'Manchester City'),
('029', 'Harvertz', 'Bayer Leverkusen'),
('011', 'Werner', 'Liverpool'),
('007', 'Sancho', 'Manchester United'),
('005', 'Upamecano', 'Leipzig'),
('010', 'Messi', 'Manchester City'),
('014', 'Aubameyang', 'Arsenal');

我希望每个球员在一张新桌子上只出现一次。例如,梅西出现了两次,但我想在新表中出现任何梅西。 我不确定如何将其转换为 Hive 或 mysql。这就是我想要的结果:

player_id   name        team
010         Messi       Barcelona
007         Sancho      Dortmund
011         Werner      Chelsea
001         De Gea      Manchester United
009         Lewandowski Bayern Munich
006         Pogba       Manchester United
017         De Bruyne   Manchester City
029         Harvertz    Bayer Leverkusen
005         Upamecano   Leipzig
014         Aubameyang  Arsenal

【问题讨论】:

我不确定您是否已经测试了该查询,但在您将 player_id 放入 order by 子句之前它不会起作用。但是,您在预期结果中显示的顺序重要吗? 但我只想在新表中取第一次出现“第一次”一词需要在某些行排序(视觉占有排序是假的,不能适用于此目的),它提供了排序唯一性。在您的表格中,唯一提供此排序的排序顺序是 ORDER BY team [ASC | DESC] - 但我怀疑此排序是否是您需要的。 @Akina 我制定了结果。它不是来自查询。第一次出现并不重要,我只希望每个玩家只出现一次。 @learning_2_code,如果顺序对您来说并不重要,那么@Fahmi 提供的答案有什么问题?它没有给你预期的结果吗? 第一次出现并不重要,我只是希望每个玩家只出现一次如果是这样,你真的需要在team 列吗? 【参考方案1】:

一个选项可能是使用row_number()

select * from
(
select *, row_number() over(partition by name order by cast(player_id as int)) as rn
from tablename
)A where rn=1

【讨论】:

order by cast(player_id as int) 不提供排序唯一性(请参阅示例数据) - 因此输出不确定。【参考方案2】:

如果你想避免窗口功能,你也可以这样做 -

Select player_id, name, max(team) as team
 from football_teams
group by player_id, name;

在这种方法中,您不需要子查询。

【讨论】:

以上是关于将 Postgre 查询转换为 Hive/Mysql的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL 中从 POSTGRE/SQL 数据库转换 UTC 时间字段

使用postgre数据库实现树形结构表的子-父级迭代查询,通过级联菜单简单举例

postgre查询一段时间内的数据

数据库小记:根据指定名称查询数据库表名及根据指定名称查询数据库所有表中的字段名称(支持mysql/postgre)

postgre与mysql区别

Jooq postgre 在 play2.5 scala 中插入错误