用于在列1中选择与第2列中的两个模式之一匹配的值对的SQL查询
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用于在列1中选择与第2列中的两个模式之一匹配的值对的SQL查询相关的知识,希望对你有一定的参考价值。
我的数据如下:
|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 1
和Pattern 2
的用户ID。所以在上面的例子中,我只想选择Value a
。
基本上,我想比较哪个用户ID已经安装了软件产品的“Lite”和“Full”。例如,由于Value B
没有与Pattern 1
和Pattern 2
配对的条目,我不想选择它。
将有许多用户ID条目,但安装的版本很少。我已经玩了很长一段时间了解这个问题,但我仍然遇到了麻烦。
答案
我可以想到两种方式,一种是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';
另一答案
该表未明确定义,但原则上查询可能类似于:
SELECT user_id
FROM installation
WHERE version = 'version 1'
INTERSECT
SELECT user_id
FROM installation
WHERE version = 'version 2';
另一答案
您可以使用具有模式1和模式2的交叉来获取
SELECT [User ID]
FROM Table
WHERE [Install Version]='Pattern 1'
INTERSECT
SELECT [User ID]
FROM Table
WHERE [Install Version]='Pattern 2';
另一答案
在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
以上是关于用于在列1中选择与第2列中的两个模式之一匹配的值对的SQL查询的主要内容,如果未能解决你的问题,请参考以下文章
如何使用模式列表在列中查找字符串并将匹配的模式添加到下一列的同一行