根据bigquery中的条件合并记录

时间:2019-01-16 14:21:38

标签: sql google-bigquery

我有多个成员行,并且希望通过优先考虑值'是',基于两列的值合并它们。

Name | Status1  |  Status2
Jon  |  Yes     |  No
Jon  |  No      |  Yes

我希望查询返回

Name | Status1 | Status2
Jon  |  Yes    |  Yes

因此,如果该列甚至有一次Yes,则必须为该人分配Yes,否则必须为No

2 个答案:

答案 0 :(得分:4)

以下是用于BigQuery标准SQL

#standardSQL
SELECT Name, MAX(Status1) AS Status1, MAX(Status2) AS Status2
FROM `project.dataset.table`
GROUP BY Name   

您可以使用示例数据进行测试

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 'Jon' Name, 'Yes' Status1, 'No' Status2 UNION ALL
  SELECT 'Jon', 'No', 'Yes' 
)
SELECT Name, MAX(Status1) AS Status1, MAX(Status2) AS Status2
FROM `project.dataset.table`
GROUP BY Name  

有结果

Row Name    Status1 Status2  
1   Jon     Yes     Yes  

答案 1 :(得分:0)

除了Mikhail的答案外,我还添加了MsSQL的另一种解决方案。语法可能不同,但逻辑类似:

create table test
(id int , name1 varchar(10), name2 varchar(10))

insert into test values (1,'yes','no')
insert into test  values (2,'no','no')
insert into test values (3,'yes','yes')

declare @searchKey varchar(10) = 'yes'
declare @cols varchar(255) = (SELECT STUFF((
    SELECT ', ' + c.name 
    FROM sys.columns  c
    JOIN sys.types AS t ON c.user_type_id=t.user_type_id
    WHERE t.name != 'int'  AND t.name != 'bit' AND t.name !='date' AND t.name !='datetime'
        AND object_id =(SELECT object_id FROM sys.tables WHERE name='test')
    FOR XML PATH('')),1,2,''))

declare @sql nvarchar(max) = 'SELECT * from test where '''+@searchKey+''' in ('+@cols+')'
exec sp_executesql @sql

编辑:请注意,如果任何列都包含特定值,则此解决方案将检查表的所有列。假设OP需要检查100列,直到status100,那么我相信像这样的动态解决方案会更方便。