Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google bigquery 映射2个表,每行的间隔日期_Google Bigquery - Fatal编程技术网

Google bigquery 映射2个表,每行的间隔日期

Google bigquery 映射2个表,每行的间隔日期,google-bigquery,Google Bigquery,我有两个带列的表,如下所示: 表A rows, key_a, date_a 1, 'k1', '2015-11-12' 2, 'k2', '2015-11-20' 3, 'k3', '2015-12-01' 表B row, key_b, date_b, Code 1, 'k1', '2015-10-12', C1 2, 'k1', '2015-09-12', C2 3, 'k1', '2015-11-01', C3 4, 'k1', '2015-

我有两个带列的表,如下所示:

表A

rows, key_a, date_a
   1,  'k1', '2015-11-12'
   2,  'k2', '2015-11-20'
   3,  'k3', '2015-12-01'
表B

row, key_b, date_b,     Code
 1,  'k1', '2015-10-12', C1
 2,  'k1', '2015-09-12', C2
 3,  'k1', '2015-11-01', C3
 4,  'k1', '2015-10-20', C4
 5,  'k1', '2015-08-19', C5
 6,  'k1', '2015-11-02', C6
 7,  'k2', '2015-10-12', C7
 8,  'k2', '2015-09-12', C8
 9,  'k2', '2015-11-01', C9
 10,  'k2', '2015-10-20', C10
 11,  'k2', '2015-08-19', C11
 12,  'k2', '2015-11-02', C12
 13,  'k3', '2015-10-12', C13
 14,  'k3', '2015-09-12', C14
 15,  'k3', '2015-11-01', C15
 16,  'k3', '2015-10-20', C16
 17,  'k3', '2015-08-19', C17
 18,  'k3', '2015-11-02', C18
我想找到表B中的行have
date\u B
是第一个使用相同的
键的行,并且只选择表B中
date\u B
介于
date\u a
date\u a-30之间的数据

这意味着:

 'k1' => '2015-11-12' to '2015-10-12' => rows view (1,3,4,6)
 'k2' => '2015-11-20' to '2015-10-20' => rows view (9,10,12)
 'k3' => '2015-12-01' to '2015-11-01' => rows view (15,18)
结果

key_a, date_a,       Code
 'k1', '2015-11-12', C1
 'k2', '2015-11-20', C10
 'k3', '2015-12-01', C15

我怎样才能做到这一点呢?

这就是您可能想要的:

select key_a,first(date_a) as first_date_a,group_concat(code) as all_codes,first(code) as first_code from (
select * from (select 1 as rows,  'k1' as key_a, date('2015-11-12') as date_a),
(select 2 as rows,  'k2' as key_a, date('2015-11-20') as date_a),
(select 3 as rows,  'k3' as key_a, date('2015-12-01') as date_a)
) table_a
join (select * from
 (select 1 as rows,  'k1' as key_b, date('2015-10-12') as date_b, 'C1' as code),
 (select 2 as rows,  'k1' as key_b, date('2015-09-12') as date_b, 'C2' as code),
 (select 3 as rows,  'k1' as key_b, date('2015-11-01') as date_b, 'C3' as code),
 (select 4 as rows,  'k1' as key_b, date('2015-10-20') as date_b, 'C4' as code),
 (select 5 as rows,  'k1' as key_b, date('2015-08-19') as date_b, 'C5' as code),
 (select 6 as rows,  'k1' as key_b, date('2015-11-02') as date_b, 'C6' as code),
 (select 7 as rows,  'k2' as key_b, date('2015-10-12') as date_b, 'C7' as code),
 (select 8 as rows,  'k2' as key_b, date('2015-09-12') as date_b, 'C8' as code),
 (select 9 as rows,  'k2' as key_b, date('2015-11-01') as date_b, 'C9' as code),
 (select 10 as rows,  'k2' as key_b, date('2015-10-20') as date_b, 'C10' as code),
 (select 11 as rows,  'k2' as key_b, date('2015-08-19') as date_b, 'C11' as code),
 (select 12 as rows,  'k2' as key_b, date('2015-11-02') as date_b, 'C12' as code),
 (select 13 as rows,  'k3' as key_b, date('2015-10-12') as date_b, 'C13' as code),
 (select 14 as rows,  'k3' as key_b, date('2015-09-12') as date_b, 'C14' as code),
 (select 15 as rows,  'k3' as key_b, date('2015-11-01') as date_b, 'C15' as code),
 (select 16 as rows,  'k3' as key_b, date('2015-10-20') as date_b, 'C16' as code),
 (select 17 as rows,  'k3' as key_b, date('2015-08-19') as date_b, 'C17' as code),
 (select 18 as rows,  'k3' as key_b, date('2015-11-02') as date_b, 'C18' as code)
 ) table_b
 on table_a.key_a=table_b.key_b
 where timestamp(date_b) between DATE_ADD(timestamp(date_a), -1, "MONTH") and timestamp(date_a)
 group by 1
返回:

+-----+-------+--------------+-------------+------------+---+
| Row | key_a | first_date_a |  all_codes  | first_code |   |
+-----+-------+--------------+-------------+------------+---+
|   1 | k1    | 2015-11-12   | C1,C3,C4,C6 | C1         |   |
|   2 | k2    | 2015-11-20   | C9,C10,C12  | C9         |   |
|   3 | k3    | 2015-12-01   | C15,C18     | C15        |   |
+-----+-------+--------------+-------------+------------+---+
结果:

key_a   date_a      code
k1      2015-11-12  C1
k2      2015-11-20  C10
k3      2015-12-01  C15

这肯定是一个很难的方法,但这应该是可行的

Select key_a, first(date_a), RIGHT(first(amalgam),3) from( select key_a, date_a, date_b + ' ' + code as amalgam from (
select * from (select 1 as rows,  'k1' as key_a, date('2015-11-12') as date_a),
(select 2 as rows,  'k2' as key_a, date('2015-11-20') as date_a),
(select 3 as rows,  'k3' as key_a, date('2015-12-01') as date_a)
) table_a
join (select * from
(select 1 as rows,  'k1' as key_b, date('2015-10-12') as date_b, 'C1' as code),
(select 2 as rows,  'k1' as key_b, date('2015-09-12') as date_b, 'C2' as code),
(select 3 as rows,  'k1' as key_b, date('2015-11-01') as date_b, 'C3' as code),
(select 4 as rows,  'k1' as key_b, date('2015-10-20') as date_b, 'C4' as code),
(select 5 as rows,  'k1' as key_b, date('2015-08-19') as date_b, 'C5' as code),
(select 6 as rows,  'k1' as key_b, date('2015-11-02') as date_b, 'C6' as code),
(select 7 as rows,  'k2' as key_b, date('2015-10-12') as date_b, 'C7' as code),
(select 8 as rows,  'k2' as key_b, date('2015-09-12') as date_b, 'C8' as code),
(select 9 as rows,  'k2' as key_b, date('2015-11-01') as date_b, 'C9' as code),
(select 10 as rows,  'k2' as key_b, date('2015-10-20') as date_b, 'C10' as code),
(select 11 as rows,  'k2' as key_b, date('2015-08-19') as date_b, 'C11' as code),
(select 12 as rows,  'k2' as key_b, date('2015-11-02') as date_b, 'C12' as code),
(select 13 as rows,  'k3' as key_b, date('2015-10-12') as date_b, 'C13' as code),
(select 14 as rows,  'k3' as key_b, date('2015-09-12') as date_b, 'C14' as code),
(select 15 as rows,  'k3' as key_b, date('2015-11-01') as date_b, 'C15' as code),
(select 16 as rows,  'k3' as key_b, date('2015-10-20') as date_b, 'C16' as code),
(select 17 as rows,  'k3' as key_b, date('2015-08-19') as date_b, 'C17' as code),
(select 18 as rows,  'k3' as key_b, date('2015-11-02') as date_b, 'C18' as code)
) table_b
on table_a.key_a=table_b.key_b
where timestamp(date_b) between DATE_ADD(timestamp(date_a), -1, "MONTH") and timestamp(date_a)) 
group by 1

如果您想要一个更干净的解决方案,而不是在日期和代码之间添加空白,您可以始终在没有空格的情况下添加它们,然后根据“amalgam”的长度执行右键(2)而不是右键(3)。老实说,我更喜欢米哈伊尔的解决方案:)

谢谢你们的回答,但在K2中,结果是C10。因为在K2中有3个日期
2015-11-01
2015-10-20
2015-11-02
在3个日期,那么日期
2015-10-20
是第一个意思是第一个,你现在想告诉我你需要什么?什么决定了数字的顺序?对不起我的问题。例如:对于k2,我们有3个代码
C9
C10
C12
(相同的键和日期之间)。我要得到的行的日期是MIN。
Select key_a, first(date_a), RIGHT(first(amalgam),3) from( select key_a, date_a, date_b + ' ' + code as amalgam from (
select * from (select 1 as rows,  'k1' as key_a, date('2015-11-12') as date_a),
(select 2 as rows,  'k2' as key_a, date('2015-11-20') as date_a),
(select 3 as rows,  'k3' as key_a, date('2015-12-01') as date_a)
) table_a
join (select * from
(select 1 as rows,  'k1' as key_b, date('2015-10-12') as date_b, 'C1' as code),
(select 2 as rows,  'k1' as key_b, date('2015-09-12') as date_b, 'C2' as code),
(select 3 as rows,  'k1' as key_b, date('2015-11-01') as date_b, 'C3' as code),
(select 4 as rows,  'k1' as key_b, date('2015-10-20') as date_b, 'C4' as code),
(select 5 as rows,  'k1' as key_b, date('2015-08-19') as date_b, 'C5' as code),
(select 6 as rows,  'k1' as key_b, date('2015-11-02') as date_b, 'C6' as code),
(select 7 as rows,  'k2' as key_b, date('2015-10-12') as date_b, 'C7' as code),
(select 8 as rows,  'k2' as key_b, date('2015-09-12') as date_b, 'C8' as code),
(select 9 as rows,  'k2' as key_b, date('2015-11-01') as date_b, 'C9' as code),
(select 10 as rows,  'k2' as key_b, date('2015-10-20') as date_b, 'C10' as code),
(select 11 as rows,  'k2' as key_b, date('2015-08-19') as date_b, 'C11' as code),
(select 12 as rows,  'k2' as key_b, date('2015-11-02') as date_b, 'C12' as code),
(select 13 as rows,  'k3' as key_b, date('2015-10-12') as date_b, 'C13' as code),
(select 14 as rows,  'k3' as key_b, date('2015-09-12') as date_b, 'C14' as code),
(select 15 as rows,  'k3' as key_b, date('2015-11-01') as date_b, 'C15' as code),
(select 16 as rows,  'k3' as key_b, date('2015-10-20') as date_b, 'C16' as code),
(select 17 as rows,  'k3' as key_b, date('2015-08-19') as date_b, 'C17' as code),
(select 18 as rows,  'k3' as key_b, date('2015-11-02') as date_b, 'C18' as code)
) table_b
on table_a.key_a=table_b.key_b
where timestamp(date_b) between DATE_ADD(timestamp(date_a), -1, "MONTH") and timestamp(date_a)) 
group by 1