7

SQL でグループ関数の出力を取得するのに問題があります。以下はテーブルの詳細です。

テーブル名「checks」が1つあり、pid、cidの2つの列があります

 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 PID                                                VARCHAR2(20)
 CID                                                VARCHAR2(20)

以下は利用可能な行です

select * from checks;

PID                  CID
-------------------- --------------------
p1                   c1
p1                   c1
p1                   c2
p1                   c2
p1                   c2
p2                   c1
p2                   c1
p2                   c1
p2                   c1
p2                   c1
p2                   c1
p2                   c2
p2                   c2
p2                   c2
p2                   c2
p2                   c2

P は参加者を表し、c はカテゴリを表します

質問

どの参加者が複数のカテゴリに参加しているか、どのカテゴリの参加者が最大に参加しているかを知る必要があります。(すべての参加者に対して)

期待される結果:

pid   cid    count(cid)
---   ---    -----------
p1    c2         3
p2    c1         6
4

5 に答える 5

5

ウィンドウ機能と CTE をサポートするデータベース システム (指定していませんが、Oracle と思われますか?) を想定すると、次のように記述します。

;With Groups as (
    select pid,cid,COUNT(*) as cnt from checks group by pid,cid
), Ordered as (
    select pid,cid,cnt,
       ROW_NUMBER() OVER (PARTITION BY pid ORDER BY cnt desc) as rn,
       COUNT(*) OVER (PARTITION BY pid) as multi
    from Groups
)
select pid,cid,cnt
from Ordered
where rn = 1 and multi > 1

最初の CTE ( ) は、一意の各組み合わせGroupsのカウントを見つけるだけです。cid,pid2 番目の CTE( Ordered) は、カウントに基づいてこれらの結果に行番号を割り当てます。最も高いカウントには行番号 1 が割り当てられます。また、それぞれに対して生成された合計行数もカウントしますpid

最後に、行番号 1 (最大数) が割り当てられ、同じ に対して複数の結果が得られた行を選択しますpid

これは、遊ぶためのOracleフィドルです。そして、これがSQL Server バージョンです(そして、Oracle バージョンを作成してくれた Andriy M に感謝します)。

于 2013-07-18T06:26:22.210 に答える
-1
select pid, cid, count
from (
    select pid, cid, count(*) as count
    from checks
    group by pid, cid
    order by count DESC
) as temp
group by pid;

同じことがMySQLでも機能しています。

于 2013-07-18T06:16:09.760 に答える
-1

MySQL ソリューションは次のとおりです。

SELECT tbl1.pid, tbl1.cid, tbl1.pairCount

FROM        (   SELECT checks.pid, checks.cid, COUNT(*) AS pairCount
                FROM checks
                GROUP BY checks.pid, checks.cid ) AS tbl1

            INNER JOIN 

            (   SELECT checks.pid, checks.cid, COUNT(*) AS pairCount
                FROM checks 
                GROUP BY checks.pid, checks.cid ) AS tbl2   

            ON tbl1.pid=tbl2.pid AND tbl1.cnt > tbl2.cnt

申し訳ありませんが、私は 2 つのサブクエリを使用していますが、より良いものを見つけることができませんでした。少なくとも、それは機能します。フィドル

GROUP BY を使用すると、グループ化されていない列に対して返される値が任意であり、MAX() 値が発生する同じ行から返されないため、単純に GROUP BY を使用することはできませんでした

于 2013-07-18T06:52:34.643 に答える