【问题标题】:I am suffering from Bigquery with StandardSQL joining method我正在遭受使用 StandardSQL 连接方法的 Bigquery
【发布时间】:2018-11-22 15:24:57
【问题描述】:

我想在 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

【问题讨论】:

  • 您能否阐明为什么您期望结果第 3 行中第二个表中的值。其背后的逻辑是什么?
  • 我分析了与住宿数据相关的 POS 数据。最后一次购买是最后入住日之后的购买,但我想放在最后入住日。

标签: google-bigquery


【解决方案1】:

我做到了

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-29
    • 1970-01-01
    • 2020-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-30
    • 1970-01-01
    相关资源
    最近更新 更多