Запрос SQL для выбора пар значений в столбце 1, которые соответствуют одному из двух шаблонов в столбце 2

Мои данные выглядят так:

|User ID        |Install Version |
|--------------------------------|
|  Value A      |     Pattern 1  |
|  Value B      |     Pattern 1  |
|  Value A      |     Pattern 2  |
|  Value C      |     Pattern 2  |
|  Value D      |     Pattern 1  |

Я хочу выбрать только идентификаторы пользователей, для которых 1 или более записей соответствуют Pattern 1 и Pattern 2. Поэтому в приведенном выше примере я бы хотел выбрать только Value a.

По сути, я хочу сравнить, какие идентификаторы пользователей установили «Lite» и «Full» программного продукта. Например, поскольку Value B не имеет записей в паре с Pattern 1 И Pattern 2, я не хочу выбирать его.

Будет много записей идентификаторов пользователей, но мало установленных версий. Я давно обдумывал эту проблему, но все же у меня проблемы с ней.

1
задан 19.03.2019, 15:35

4 ответа

Я могу придумать два пути, один с GROUP_CONCAT, а другой с использованием подзапроса.

SELECT user_id, GROUP_CONCAT(installed_version) as all_patterns
FROM your_table
GROUP BY user_id
HAVING all_patterns REGEXP 'Pattern 1'
AND all_patterns REGEXP 'Pattern 2';

-

SELECT * FROM 
(
SELECT user_id, installed_version FROM your_table
WHERE installed_version LIKE 'Pattern 1'
) as tmp
WHERE installed_version LIKE 'Pattern 2';
0
ответ дан 30.04.2019, 23:47
  • 1
    Exaclty мое чувство, когда я нашел этот метод:) – Rahul Kapoor 19.03.2019, 17:26
  • 2
    @LaurenzAlbe... Второе просто doesn' t работа. Первый doesn' t работают в Пост-ГРЭС. Я понятия не имею, почему это было бы upvoted, если тег MySQL не был удален в какой-то момент. – Gordon Linoff 20.03.2019, 00:02
  • 3
    Я соглашаюсь с первым методом - он работает отлично, когда относится мои данные. Я никогда не знал о, ПЕРЕСЕКАЮТСЯ – Lachlan Vass 21.03.2019, 11:56
  • 4
    Вы правы, но код является все гипотетическим вот почему я didn' t двойная проверка и я просто скопировал Ваш ответ:) – Talal 31.03.2019, 05:58

Вы можете использовать пересечение, чтобы получить как шаблон 1, так и шаблон 2

SELECT [User ID]
FROM Table
WHERE [Install Version]='Pattern 1'
INTERSECT
SELECT [User ID]
FROM Table
WHERE [Install Version]='Pattern 2';
0
ответ дан 30.04.2019, 23:47
  • 1
    таким образом, Вы говорите, что фасад является единственной точкой контакта для ВСЕХ Ваших конечных точек REST.. Это - правильный дизайн так или иначе.. – Deepak 30.03.2019, 02:12

В Postgres я бы пошел на:

SELECT user_id
FROM t
GROUP BY user_id
HAVING COUNT(*) FILTER (WHERE installed_version = 'Pattern 1') > 0 AND
       COUNT(*) FILTER (WHERE installed_version = 'Pattern 2') > 0
0
ответ дан 30.04.2019, 23:47
  • 1
    Таким образом, я должен назвать загрузку файла от фасада или отдельного сервиса? – Ankit Bansal 30.03.2019, 02:22

Таблица четко не определена, но в принципе запрос может выглядеть примерно так:

SELECT user_id
FROM installation
WHERE version = 'version 1'
INTERSECT
SELECT user_id
FROM installation
WHERE version = 'version 2';
0
ответ дан 30.04.2019, 23:47
  • 1
    Для точки a), фасад действует как агрегатор. Это называет n сервисы, агрегировало ответ, и отправьте заключительный ответ пользователю. – Ankit Bansal 30.03.2019, 02:09

Теги

Похожие вопросы