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 に答える