【问题标题】:Select rows with multiple distinct column value combinations选择具有多个不同列值组合的行
【发布时间】:2012-05-25 10:10:51
【问题描述】:

我有一个包含 3 列的表格:id、val1 和 val2。

对于 val2 的每个不同值,我想选择存在 多个 val1 不同值的所有行。

例子:

| id | val1 | val2 |
|------------------|
| 1  | A1   |  a2  |
| 2  | A1   |  a2  |
| 3  | A1   |  b2  |
| 4  | B1   |  b2  |
| 5  | A1   |  c2  |
| 6  | A1   |  c2  |
| 7  | A1   |  c2  |
| 8  | A1   |  d2  |
| 9  | C1   |  d2  |
| 10 | A1   |  d2  |

想要的结果:

| id | val1 | val2 |
|------------------|
| 3  | A1   |  b2  |
| 4  | B1   |  b2  |
| 8  | A1   |  d2  |
| 9  | C1   |  d2  |
| 10 | A1   |  d2  |

我没有设法提出任何允许我这样做的查询,也许其他人对如何解决这个问题有想法。

【问题讨论】:

  • 什么数据库系统? MSSQL 2005/08/12,MySQL...
  • 第 8 行和第 10 行相同,只是 ID 号不同。我不明白你为什么要包括 8 和 10,但排除 1 和 2,除了 id 号之外它们也是相同的。
  • @Catcall:对于 val2=a2(第 1-2 行),仅存在 1 个 val1 的不同值,但对于 val2=d2(第 8-10 行)存在 1 个以上的 val1 不同值跨度>

标签: sql postgresql select postgresql-9.1


【解决方案1】:

您可以使用having 子句搜索具有多个不同值val1 的val2。例如:

select  yt.*
from    YourTable yt
join    (
        select  val2
        from    YourTable
        group by
                val2
        having  count(distinct val1) > 1
        ) as filter
on      yt.val2 = filter.val2

【讨论】:

  • @aF:它确实与示例结果匹配,请参阅 Paddy 的 SQLFIddle
【解决方案2】:

使用聚合窗口函数,您也可以这样做:

SELECT
  id,
  val1,
  val2
FROM (
  SELECT
    *,
    MIN(val1) OVER (PARTITION BY val2) AS minval1,
    MAX(val1) OVER (PARTITION BY val2) AS maxval1
  FROM atable
) s
WHERE minval1 <> maxval1

【讨论】:

  • 非常好,您的查询速度几乎是我的两倍。并且更具可读性。
【解决方案3】:
SELECT * 
FROM   TABLE_2 
WHERE  EXISTS (SELECT 1 
               FROM   (SELECT val2, 
                              val1, 
                              Count(*) AS Number 
                       FROM   TABLE_2 
                       GROUP  BY val2, 
                                 val1 
                       HAVING Count(*) = 1) a 
               WHERE  TABLE_2.val2 = a.val2) 
ORDER  BY ID 

【讨论】:

  • @Romil:是的,它现在可以工作了,因为你和 Andomars 的查询都是正确的,我会检查哪个在更大的表中产生更好的性能(但是我的表不是那么大)
【解决方案4】:

试试这个查询:

SELECT * from tbl where val2 in (SELECT  val2 FROM `tbl`  group by val2 having  
 count(distinct(val1)) > 1)

【讨论】:

    猜你喜欢
    • 2015-10-17
    • 1970-01-01
    • 1970-01-01
    • 2014-12-08
    • 1970-01-01
    • 2017-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多