Слияние записей на основе условий в BigQuery - PullRequest
0 голосов
/ 16 января 2019

У меня есть несколько строк для членов, и я хочу объединить их на основе значений двух столбцов, отдав приоритет значению «Да».

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

Я хочу, чтобы запрос возвратил

Name | Status1 | Status2
Jon  |  Yes    |  Yes

Итак, если в столбце есть Yes хотя бы один раз, ему нужно присвоить Yes для человека и No в противном случае.

Ответы [ 2 ]

0 голосов
/ 16 января 2019

В дополнение к ответу Михаила я добавляю еще одно решение с 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

Изменить: Обратите внимание, что это решение проверяет все столбцы таблицы, если конкретное значение включено в любой столбец. Предположим, ОП требует проверки 100 столбцов, до status100, тогда я считаю, что такое динамическое решение было бы более удобным.

0 голосов
/ 16 января 2019

Ниже для BigQuery Standard 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  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...