如果有 id 重复,则选择所有行,然后选择具有特定类型的(2 个)

Posted

技术标签:

【中文标题】如果有 id 重复,则选择所有行,然后选择具有特定类型的(2 个)【英文标题】:Select all rows if there are id duplicates then select the one (of 2) with particular type 【发布时间】:2017-03-18 01:19:41 【问题描述】:

我有一张桌子

其中一些“job_id”(“job_id”列)有重复项。我需要从该表中选择所有列。如果“job_id”列中有重复项,则选择类型为“Pending Starts”的行(从“type”列中)。我也尝试将表连接到自身,但它也不起作用。

select  *
case x.job_id
    when count(*)>1 then x.type="Pending Starts"
    end as type
from X

【问题讨论】:

【参考方案1】:

使用两个查询的联合。查找所有没有重复作业 ID 的行。另一个查找所有重复的作业 ID 并返回带有 type = 'PendingStarts' 的行。

SELECT a.*
FROM X AS a
JOIN (SELECT job_id
      FROM X
      GROUP BY job_id
      HAVING COUNT(*) = 1) AS b
ON a.job_id = b.job_id

UNION ALL

SELECT a.*
FROM X AS a
JOIN X AS b ON a.job_id = b.job_id
WHERE a.type = 'PendingStarts'
AND b.type != 'Pending Starts'

我假设当有重复时,类型是不同的。

【讨论】:

谢谢!错误:42803:列“X.data_date”必须出现在 GROUP BY 子句中或用于聚合函数 您可以关闭ONLY_FULL_GROUP_BY SQL模式,或者在我的回答中使用更新后的查询。 谢谢你,在第二部分我假设你加入“ON a.job_id=y.job_id”而不是 b.job_id。但无论如何我有这个错误 ERROR: 42601: each UNION query must have the same number of columns 我的意思是JOIN X AS b。两个查询应该有相同数量的列,因为a.* 在两者中是相同的。也许你写的是SELECT *而不是SELECT a.*【参考方案2】:

你总是想要 Pending Starts 值,所以从那个开始:

select t.*
from t
where t.type = 'Pending Starts'
union all
select t.*
from t
where not exists (select 1
                  from t t2
                  where t2.job_id = t.job_id and t2.type = 'Pending Starts'
                 );

这不是您的问题所要求的,但它似乎是您可能想要的。

【讨论】:

以上是关于如果有 id 重复,则选择所有行,然后选择具有特定类型的(2 个)的主要内容,如果未能解决你的问题,请参考以下文章

SQL选择一列中具有重复值的所有行

按特定顺序选择特定行[重复]

选择查询优化

Pandas:如果特定列满足特定条件,则选择行

如果该行具有超过 1 个相同的值/重复,则从选择中排除行

从表中选择行,其中具有相同 id 的另一个表中的行在另一列中具有特定值