选择在不同行上具有 NUMBER 1 和 2 行的 ID

Posted

技术标签:

【中文标题】选择在不同行上具有 NUMBER 1 和 2 行的 ID【英文标题】:Select ID's that have rows with NBR 1 and 2 on separate rows 【发布时间】:2019-04-03 11:29:41 【问题描述】:

我希望编写 SQL 以返回 VENDOR_ID 的行同时具有 NBR_ID = 1 的行和 NBR_ID = 2 的另一行。在下面的示例中,SQL 将返回 VENDOR_ID 93309A 的数据,其中一行是 NBR_ID 1 ,另一行是 NBR_ID 2。

GROUP_ID     VENDOR_ID    NBR_ID
AUX          27           1
AUX          87188A       1
AUX          92481A       1
AUX          92482A       1
AUX          92527A       1
AUX          93309A       1
AUX          93309A       2
AUX          93328A       1

我编写了以下 SQL,但这并没有专门返回 VENDOR_ID 的 NBR_ID 为 1 的行和 NBR_ID 为 2 的另一行。

SELECT GROUP_ID, VENDOR_ID, NBR_ID
FROM TEST_TABLE
WHERE NBR_ID IN (1,2)

如何更新以仅返回在不同行上具有这些 NBR_IDVENDOR_ID

【问题讨论】:

【参考方案1】:

使用相关子查询

SELECT GROUP_ID,VENDOR_ID,NBR_ID
FROM TEST_TABLE a
WHERE exists(select 1 from TEST_TABLE b where a.GROUP_ID=b.group_id and 
a.VENDOR_ID=b.vendor_id and NBR_ID IN (1,2) 
having count(distinct nbr_id)=2) and NBR_ID IN (1,2) 

【讨论】:

完美运行!谢谢! 这似乎返回了 VENDOR_ID 的行,其中 NBR_ID 的行数大于 2,即如果 VENDOR_ID 有 4 个 NBR_ID,它将返回第 1-4 行,每个在不同的行上。我怎样才能返回只有 NBR_ID 第 1 行和第 2 行的 VENDOR_ID 谢谢 - 有没有办法仍然像以前一样选择 GROUP_IDNBR_ID 列? 太棒了,按预期工作!再次感谢您的跟进。【参考方案2】:

你可以使用聚合:

SELECT GROUP_ID, VENDOR_ID
FROM TEST_TABLE
WHERE NBR_ID IN (1, 2)
GROUP BY GROUP_ID, VENDOR_ID
HAVING COUNT(DISTINCT NBR_ID) = 2;

这不会返回 NBR_ID 有两个原因。首先,您的问题并未指定您想要它。其次,它相当多余,因为您知道列表由 1 和 2 组成。

【讨论】:

我将NBR_ID 添加到SelectGroup By,但它没有返回任何数据。我仍然想显示这一列,并返回两行(分别为NBR_ID 1 和NBR_ID 2)。 此外,这似乎返回了 NBR_ID 1 和 NBR_ID 2 以上的行,它还返回了 NBR_ID、3 或更多的 VENDOR_ID。理想情况下,我只想返回只有 1 和 2 的。【参考方案3】:

使用存在

select t1.* from TEST_TABLE t1
where exists ( select 1 from TEST_TABLE t2 where t1.VENDOR_ID=t2.VENDOR_ID
                                         and t1.GROUP_ID=t2.GROUP_ID
                                      and NBR_ID in (1,2)
                                      having count(distinct NBR_ID)=2)
and NBR_ID in (1,2)

【讨论】:

这是不正确的,它返回每个 VENDOR_ID 的 NBR_ID 大于 2 的行(例如 3、4、5) 这仍会返回 NBR_ID 大于 2 的行的 VENDOR_ID(例如 3、4、5)。 @Nick 立即查看

以上是关于选择在不同行上具有 NUMBER 1 和 2 行的 ID的主要内容,如果未能解决你的问题,请参考以下文章

pyspark:如果列在不同行中具有相同的值,则合并两行或多行

使用 RecyclerView Android Studio 在不同行上设置列

面对不同行和不同列中的数字

在同一列上连接具有不同行的 2 个表

MySQL Select ID 出现在具有多个特定值的列的不同行上

SSIS:创建具有不同行格式的平面文件