bigquery中的sql动态条件连接

kmpatx3s  于 2021-07-29  发布在  Java
关注(0)|答案(1)|浏览(360)

我试图在bigquery中编写一个动态条件语句,以便根据某些条件动态地联接表。一个id可能有一个或多个条件。如何动态地“过滤”一系列id条件(使用表1、2和3)以获得最终表中的一组MasterProductID?
表1-标识表

表2-归档表

表3-价格

在这种情况下,我们有3个条件要为id 1求值,2个条件要为id 2求值,1个条件要为id 3求值。
在我们也有价格条件的情况下,它应该连接到价格表并根据表1中的运算符和值进行过滤。至于产品条件,我不必在任何表上联接,我只取表1中的值。
我期待的最终结果集。
最终表格

我现在所做的:

select masterProductId, row_number() over (partition by id ) sq
from `filing_table` p 
left join `identification_table` pc
on case when subject = 'brand' then p.brandName when subject='category' then categoryName end = pc.boundaryValue
--on p.brandName = pc.boundaryValue or p.categoryName = boundaryValue
left join `price` pp
on p.code = pp.code
where 1=1
and pc.code = 'Id 2'
--and pp.RRP < safe_cast(pc1.boundaryValue as float64)

这将作为一个整体来评估一切。我不知道如何在一组一组的基础上评估ID。

hgtggwj0

hgtggwj01#

下面是bigquery标准sql,假设表的设置如下(在问题注解中得到op的同意) identification_tableSELECT 'Id 1' id, 'masterProductId' subject, '=' operator, '1007' value UNION ALL SELECT 'Id 1', 'brandName', '=', 'brand p' UNION ALL SELECT 'Id 1', 'categoryName', '=', 'category 1' UNION ALL SELECT 'Id 2', 'categoryName', '=', 'category 1' UNION ALL SELECT 'Id 2', 'price', '<', '130' UNION ALL SELECT 'Id 3', 'categoryName', '=', 'category 3'filing_tableSELECT 11 code, 'category 1' categoryName, 'brand p' brandName, 1001 masterProductId UNION ALL SELECT 22, 'category 1', 'brand z', 1002 UNION ALL SELECT 33, 'category 2', 'brand c', 1003 UNION ALL SELECT 44, 'category 2', 'brand v', 1004 UNION ALL SELECT 55, 'category 3', 'brand e', 1005price ```
SELECT 11 code, 3 price UNION ALL
SELECT 22, 100 UNION ALL
SELECT 33, 8 UNION ALL
SELECT 44, 9 UNION ALL
SELECT 77, 28

下面是 `filing_table` 那些 `masterProductId` 的所有标准 `identification_table` ```
EXECUTE IMMEDIATE '''
SELECT masterProductId
FROM (
  SELECT f.*, price
  FROM `filing_table` f
  LEFT JOIN `price` p
  USING(code)
)
WHERE ''' || (  
  SELECT STRING_AGG('(' || condition || ')', ' OR ')
  FROM (
    SELECT STRING_AGG(FORMAT('(%s %s %s)', subject, operator, value), ' AND ') condition
    FROM `identification_table`,
    UNNEST([IF(subject IN ('price', 'masterProductId'), value, '"' || value || '"')]) value
    GROUP BY id
  ));

如果要应用于样本数据,如答案顶部所示-输出为

Row masterProductId  
1   1001     
2   1002     
3   1005

相关问题