3

次のようなテーブルがあります。

ID   Group  Gender
------------------
1    A      M
2    A      M
3    A      F
4    A      M
5    A      U
6    B      F
7    B      F
8    B      M
9    C      U
10   C      F
11   C      U

性別ごとにモードグループを計算しようとしています。つまり、性別ごとに、最も人気のあるグループを教えてください. したがって、私が望む結果は次のようになります。

Gender  ModeGroup
-----------------
M       A          (because 3 males in group A, 1 in B and 0 in C)
F       B          (because 2 females in group B, 1 in A and 1 in C)
U       C          (because 2 unknown in group C, 0 in B and 1 in C)

同点の場合は、同点のグループごとに返されるレコードが必要です。

TSQLでこれをエレガントに行うにはどうすればよいですか? ウィンドウ関数を使用する必要があると思いますが、どうすればいいのか苦労しています。

4

4 に答える 4

6

これが私のNo-CTEソリューションです:

SELECT
  Gender,
  [Group]
FROM
  (
    SELECT
      [Group],
      Gender,
      RANK() OVER(PARTITION BY Gender ORDER BY [Count] DESC) AS [Rank]
    FROM
      (
        SELECT [Group], Gender, SUM(1) AS [Count]
        FROM GroupGender
        GROUP BY [Group], Gender
      ) AS counts
  ) AS ranks
WHERE
  [Rank] = 1

SQL Fiddle Demos: No tiesWith ties

更新:(コメントを参照)

于 2012-10-25T05:03:52.333 に答える
3
Declare @t Table(Id Int Identity, [Group] Varchar(1),Gender Varchar(1))
    Insert Into @t Values
    ('A','M'),('A','M'),('A','F'),('A','M'),('A','U'),
    ('B','F'),('B','F'),('B','M'),
    ('C','U'),('C','F'),('C','U')

;With Cte As 
(
    Select 
        [Group]
        ,Gender
        ,GenderCount = Count(Gender)
    From @t
    Group By [Group],Gender
)

Select Gender,ModeGroup = [Group]
From (
        Select 
            *,
        Rn = Dense_Rank() Over(Partition by [Group] order by [Group],GenderCount desc)
        from Cte
     )X
Where Rn =1

結果

Gender  ModeGroup
M       A
F       B
U       C
于 2012-10-25T04:12:51.890 に答える
1

共通テーブル式を使用し、

WITH results
AS
(
    SELECT  Gender, 
            [GROUP], 
            COUNT(*) totalCount,
            ROW_NUMBER() OVER (Partition BY Gender ORDER BY COUNT(*) DESC) a
    FROM table1
    GROUP BY Gender, [GROUP]
)
SELECT Gender, [GROUP]
FROM RESULTs
WHERE a = 1
-- ORDER BY [GROUP]

SQLFiddle デモ

于 2012-10-25T04:05:46.533 に答える
0

のようなものはどうですか

;WITH Vals AS (
        SELECT  Gender,
                [Group],
                COUNT([Group]) Cnt
        FROM    Table1
        GROUP BY Gender,
                [Group]
)
, ValsID AS (
        SELECT  *,
                ROW_NUMBER() OVER (PARTITION BY Gender ORDER BY Cnt DESC) RowID
        FROM    Vals
)
SELECT  Gender,
        [Group]
FROM    ValsID
WHERE   RowID = 1

SQL フィドルのデモ

于 2012-10-25T04:06:02.507 に答える