用于在列1中选择与第2列中的两个模式之一匹配的值对的SQL查询

问题描述 投票:1回答:4

我的数据如下:

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

我想只选择一个或多个条目匹配Pattern 1Pattern 2的用户ID。所以在上面的例子中,我只想选择Value a

基本上,我想比较哪个用户ID已经安装了软件产品的“Lite”和“Full”。例如,由于Value B没有与Pattern 1Pattern 2配对的条目,我不想选择它。

将有许多用户ID条目,但安装的版本很少。我已经玩了很长一段时间了解这个问题,但我仍然遇到了麻烦。

sql postgresql
4个回答
3
投票

我可以想到两种方式,一种是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';

1
投票

该表未明确定义,但原则上查询可能类似于:

SELECT user_id
FROM installation
WHERE version = 'version 1'
INTERSECT
SELECT user_id
FROM installation
WHERE version = 'version 2';

0
投票

您可以使用具有模式1和模式2的交叉来获取

SELECT [User ID]
FROM Table
WHERE [Install Version]='Pattern 1'
INTERSECT
SELECT [User ID]
FROM Table
WHERE [Install Version]='Pattern 2';

0
投票

在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
© www.soinside.com 2019 - 2024. All rights reserved.