google-bigquery - 我正在遭受使用 StandardSQL 连接方法的 Bigquery
问题描述
我想在 Bigquery 的 StandardSQL 中使用以下两个表(POS 和 STAY)来产生以下结果。但是,第三行的join部分并不成功。请告诉我一个好方法。
dt rm total s_dt s_rm s_rank
1 1 r1 100 1 r1 A
2 2 r1 100 2 r1 B
3 3 r1 100 2 r1 B
##dt = date type
这是我写的查询。
WITH POS AS(
select 1 as dt,"r1" as rm,100 as total
UNION ALL
select 2 as dt,"r1" as rm,100 as total
UNION ALL
select 3 as dt,"r1" as rm,100 as total
),
STAY AS(
select 1 as dt,"r1" as rm,"A" as rank
UNION ALL
select 2 as dt,"r1" as rm,"B" as rank
)
SELECT
p.*,
s.dt as s_dt,
s.rm as s_rm,
s.rank as s_rank
FROM
POS as p
LEFT JOIN
STAY as s
ON
p.dt = s.dt
and
p.rm = s.rm
这就是结果。
dt rm total s_dt s_rm s_rank
1 1 r1 100 1 r1 A
2 2 r1 100 2 r1 B
3 3 r1 100 null null null
解决方案
我做的
WITH POS AS(
select 1 as dt,"r1" as rm,100 as total
UNION ALL
select 2 as dt,"r1" as rm,100 as total
UNION ALL
select 3 as dt,"r1" as rm,100 as total
),
STAY AS(
select 1 as dt,"r1" as rm,"A" as rank
UNION ALL
select 2 as dt,"r1" as rm,"B" as rank
),
POS_STAY as(
SELECT
p.*,
s.dt as s_dt,
s.rm as s_rm,
s.rank as s_rank,
if(p.dt = s.dt,1,0) as flag,
max(if(p.dt = s.dt,1,0)) over (PARTITION BY p.dt) as dt_flag,
max(s.dt) over (PARTITION BY p.dt) as max_s_dt_flag
FROM
POS as p
CROSS JOIN
STAY as s
)
select
*
from
POS_STAY
WHERE
flag = 1 or (dt_flag = 0 and s_dt = max_s_dt_flag)
这就是结果。
dt rm total s_dt s_rm s_rank flag dt_flag max_s_dt_flag
1 1 r1 100 1 r1 A 1 1 2
2 2 r1 100 2 r1 B 1 1 2
3 3 r1 100 2 r1 B 0 0 2
推荐阅读
- cloud-foundry - Cloud Foundry 中的度量注册器
- python - 匹配两个数据框中的某些列以获得相似度分数
- google-cloud-platform - 谷歌 GCP 云运行 redis 客户端失去与实例的连接
- numpy - 如何获取张量中的特定元素(pytorch)
- javascript - 如何使用省略号在 JSX 中显示最后 6 个字符?
- html - 如何增加一个人的高度与行中的其他人对齐?
- asp.net - 使用会话变量查询 SQL Server
- node.js - Nodemailer错误:连接ECONNREFUSED 127.0.0.1:587(errno:-61),但我指定端口:465,安全:true
- visual-studio-2017 - VSIX 项目 - 属性工具窗口扩展
- sql - 为什么我的 BigQuery 保留与 Firebase 不一致?