как выбрать группу без актуальных группирующих элементов - PullRequest
0 голосов
/ 15 февраля 2019

У меня есть таблица, которая настроена таким образом:

doc product
a   2
a   1
a   1
b   1
c   3
c   2
d   1

Мне нужно выбрать все элементы, которые имеют тот же идентификатор документа, который заказал продукт 1, но без фактической группировки всех элементов в документе.

, поэтому конечный результат должен выглядеть примерно так:

doc product
a   2
a   1
a   1
b   1
d   1

Есть ли способ достижения этого типа выбора?

Ответы [ 3 ]

0 голосов
/ 15 февраля 2019
SELECT *
FROM yourTable
WHERE doc IN (
    SELECT doc
    FROM yourTable
    WHERE product = 1)

Подзапрос находит все документы, которые заказали продукт 1. Затем основной запрос находит все строки с этими документами.

или

SELECT t1.*
FROM yourTable AS t1
JOIN (
    SELECT DISTINCT doc
    FROM yourTable
    WHERE product = 1) AS t2
ON t1.doc = t2.doc

DISTINCT необходимочтобы предотвратить дублирование всех строк по числу раз, которое doc возвращается подзапросом.

, если таблица велика, я рекомендую второй метод, поскольку MySQL имеет некоторые печально известные проблемы производительности с запросами WHERE xxx IN (subquery).

0 голосов
/ 15 февраля 2019

Ниже приведено описание для BigQuery Standard SQL

#standardSQL
SELECT *
FROM `project.dataset.table`
WHERE doc IN (SELECT DISTINCT doc FROM `project.dataset.table` WHERE product = 1)  

и особой опции BigQuery (для развлечения и обучения):

#standardSQL
SELECT doc, product 
FROM (
  SELECT doc, ARRAY_AGG(product) arr
  FROM `project.dataset.table`
  GROUP BY doc
  HAVING 1 IN UNNEST(arr)
) t, t.arr product
0 голосов
/ 15 февраля 2019

Есть ли причина, по которой вы не хотите использовать здесь обычное соединение или подзапрос?

Примерно так:

Select * from table where doc in (
  select doc from table where product = 1
) t1 ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...