SQL查询以选择列1中与列2中两种模式之一匹配的值对

SQL查询以选择列1中与列2中两种模式之一匹配的值对,sql,postgresql,Sql,Postgresql,我的数据如下所示: |User ID |Install Version | |--------------------------------| | Value A | Pattern 1 | | Value B | Pattern 1 | | Value A | Pattern 2 | | Value C | Pattern 2 | | Value D | Pattern

我的数据如下所示:

|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
模式2
匹配的用户ID。因此,在上面的示例中,我只想选择
值a

基本上,我想比较哪些用户Id同时安装了“Lite”和“Full”软件产品。例如,由于
值B
没有与
模式1
模式2
配对的条目,因此我不想选择它


将有许多用户ID条目,但安装的版本很少。这个问题我已经研究了很长一段时间了,但我还是有问题

该表没有明确定义,但原则上查询可能类似于以下内容:

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

该表没有明确定义,但原则上查询可能类似于以下内容:

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

可以使用intersect来获取同时具有模式1和模式2的对象

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

可以使用intersect来获取同时具有模式1和模式2的对象

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

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


我可以想到两种方法,一种是使用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 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

在博士后,我会选择:

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

当我找到这个方法时,我的感觉是:)@LaurenzAlbe。第二个根本不起作用。第一种方法不适用于博士后。我不知道为什么这会被提升,除非MySQL标签在某个时候被移除。我同意第一种方法——它在应用于我的数据时非常有效。当我发现这个方法时,我从不知道我的感受:)@LaurenzAlbe。第二个根本不起作用。第一种方法不适用于博士后。我不知道为什么这会被提升,除非MySQL标签在某个时候被移除。我同意第一种方法——它在应用于我的数据时非常有效。我从来都不知道INTERSECT