Как выбрать записи на основе конкретных условий - PullRequest
1 голос
/ 27 марта 2019

У меня есть таблица с именем "ticket_lc", как показано ниже

enter image description here

Из приведенной выше таблицы мне нужно выбрать только те записи, которые удовлетворяютусловие

условие: статус заявки должен быть «назначен», «закрыт» и «разрешен»

, поэтому в приведенной выше таблице только 102 заявки удовлетворяют условию, если заявка содержит другиечем эти 3, тогда мой запрос не должен выбирать эти билеты.

кто-нибудь может мне помочь в этом .. !!!

Спасибо

Ответы [ 3 ]

1 голос
/ 27 марта 2019

Ниже для BigQuery Standard SQL

#standardSQL
SELECT ticket_id
FROM `project.dataset.ticket_lc`
GROUP BY ticket_id
HAVING COUNT(DISTINCT status) = 3
AND COUNTIF(LOWER(status) NOT IN ('assigned', 'closed', 'resolved')) = 0 

Вы можете проверить, поиграть с выше, используя пример данных из вашего вопроса, как в примере ниже

#standardSQL
WITH `project.dataset.ticket_lc` AS (
  SELECT 101 ticket_id, 'Assigned' status UNION ALL
  SELECT 101, 'Pending' UNION ALL
  SELECT 101, 'Resolved' UNION ALL
  SELECT 101, 'Closed' UNION ALL
  SELECT 102, 'Assigned' UNION ALL
  SELECT 102, 'Resolved' UNION ALL
  SELECT 102, 'Closed' UNION ALL
  SELECT 103, 'Assigned' UNION ALL
  SELECT 103, 'Pending' UNION ALL
  SELECT 103, 'Pending' UNION ALL
  SELECT 103, 'Assigned' UNION ALL
  SELECT 103, 'Resolved' UNION ALL
  SELECT 103, 'Closed' 
)
SELECT ticket_id
FROM `project.dataset.ticket_lc`
GROUP BY ticket_id
HAVING COUNT(DISTINCT status) = 3
AND COUNTIF( LOWER(status) NOT IN ('assigned', 'closed', 'resolved')) = 0 

с результатом

Row ticket_id    
1   102  
1 голос
/ 27 марта 2019

Вы можете выполнить агрегацию:

select ticket_id
from table t
group by ticket_id
having sum( case when status not in ('assigned', 'closed', 'resolved') then 1 else 0 end ) = 0 and
       count(*) = 3;

Если у вас есть дублированный статус для заявки, используйте distinct внутри count().

0 голосов
/ 27 марта 2019

Вроде интересная проблема. Я придумал эту проверку, если все покрыто и сумма правильная:

WITH t AS (SELECT * FROM UNNEST(
  [struct(101 as ticket_id, 'assigned' as status),(101,'closed'),
    (102,'assigned'),(102,'resolved'),(102,'closed'),
    (104,'assigned'),(104,'assigned'),(104,'closed'),
    (103,'assigned'),(103,'pending'),(103,'pending'),(103,'assigned'),(103,'resolved'),(103,'closed')]  
  )
)

SELECT ticket_id, array_agg(distinct status) as st 
FROM t
group by 1
having (SELECT count(1)=3 FROM unnest(st) a left join unnest(['assigned','resolved','closed']) b on a=b)

Включает скорректированные выборочные данные, чтобы охватить больше проблемных случаев.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...