2

我有一个像这样的名为 MyTable 的表

A    B
101  Dog
209  Cat
209  Cat
209  Dog
193  Cow
193  Dog
101  Dog
193  Dog
193  Cow

我想B为每个人提取最常见的,A所以它最终会是这样的(注意可能有联系)

    A    B
    101  Dog
    209  Cat
    193  Dog
    193  Cow

我怎么能写 sql 来做到这一点?

4

4 回答 4

2

或者,您可以使用HAVING从句代替JOIN.

SELECT A, B
FROM table1 o
GROUP BY A, B
HAVING COUNT(*) = 
    (
        SELECT MAX(totalCOunt)
        FROM
        (
            SELECT A, B, COUNT(*) totalCount
            FROM table1
            GROUP BY A,B
        ) x
        WHERE o.A = x.A 
        GROUP BY x.A
    )

SQLFiddle 演示

于 2012-10-25T13:19:11.657 回答
2

您可以使用过滤连接列出(A,B)具有最高行数的组合:

select  src.*
from    (
        select  A
        ,       B
        ,       count(*) cnt
        from    YourTable
        group by
                A
        ,       B
        ) src
join    (
        select  A
        ,       max(cnt) as maxcnt
        from    (
                select  A
                ,       B
                ,       count(*) cnt
                from    YourTable
                group by
                        A
                ,       B
                ) comb
        group by
                A
        ) maxab
on      maxab.A = src.A
        and maxab.maxcnt = src.cnt

SQL Fiddle 的示例。

如果您的数据库支持窗口函数,您可以使用dense_rank(),例如:

select  *
from    (
        select  dense_rank() over (
                    partition by A
                    order by cnt desc) as rn
        ,       *
        from    (
                select  A
                ,       B
                ,       count(*) cnt
                from    YourTable
                group by
                        A
                ,       B
                ) t1
        ) t2
where   rn = 1

SQL Fiddle 的窗口函数示例。 窗口函数在 SQL Server、Oracle 和 PostgeSQL 的最新版本中可用。

于 2012-10-25T13:24:10.123 回答
1
select g3.A,g3.B
from
(
    select A,Max(C) MC
    from
    (
        select A,B,count(*) C
        from (<your entire select query>) tbl
        group by A,B
    ) g1
    group by A
) g2
join
(
    select A,B,count(*) C
    from (<your entire select query>) tbl
    group by A,B
) g3 on g2.A=G3.A and g3.C=g2.MaxC
于 2012-10-25T13:24:16.580 回答
1

SQL FIDDLE 示例

select
    A, B
from
(
  select
      A, B, row_number() over (partition by A order by cnt desc) as RowNum
  from
  (
    select
       T.A, T.B, count(*) over (partition by T.A, T.B) as cnt
    from T
  ) as A
) as B
where RowNum = 1
于 2012-10-25T13:41:22.680 回答