2016-05-20 8 views
0

私は、同じ人物のために、記録が不十分で社会的人口統計情報の一貫性のないレコードを掃除しています。私は一人ひとりのために最も一般的に現れる価値(モード)を取りたいと思っています。 (民族複数の列で最も頻繁に発生する(モーダル)値を取る

DROP TABLE dbo.table 
SELECT DISTINCT [id], [ethnic_group] AS [ethnic_mode], ct INTO dbo.table 
FROM (
    SELECT row_number() OVER (PARTITION BY [id] ORDER BY count([ethnic_group]) DESC) as rn, count([ethnic_group]) as ct, [ethnic_group], [id] 
    FROM 
    dbo.mytable GROUP BY [id], [ethnic_group]) ranked 
    where rn = 1 
ORDER BY ct DESC 

しかし、私はいくつかの変数のためにこれをしたい:それをする

一つの方法は、各IDの最高回数を保持したまま、idでパーティション分割し、各値が発生した回数をカウントすることですグループ、所得グループなど)。

1つのステートメント内で複数の変数のモードを選択し、(変数ごとに別のテーブルを作成するのではなく)1つのテーブルに挿入する方法を教えてください。

次の表は、私が何をしたいの例を示します。

DROP TABLE mytable; 
CREATE TABLE mytable(
    id  VARCHAR(2) NOT NULL PRIMARY KEY 
    ,ethnic_group VARCHAR(12) NOT NULL 
    ,ethnic_mode VARCHAR(11) NOT NULL 
    ,income VARCHAR(6) NOT NULL 
    ,income_mode VARCHAR(11) NOT NULL 
); 
INSERT INTO mytable(id,ethnic_group,ethnic_mode,income,income_mode) VALUES ('id','ethnic_group','ethnic_mode','income','income_mode'); 
INSERT INTO mytable(id,ethnic_group,ethnic_mode,income,income_mode) VALUES ('1','white','white','middle','middle'); 
INSERT INTO mytable(id,ethnic_group,ethnic_mode,income,income_mode) VALUES ('1','white','white','middle','middle'); 
INSERT INTO mytable(id,ethnic_group,ethnic_mode,income,income_mode) VALUES ('1','mixed','white','high','middle'); 
INSERT INTO mytable(id,ethnic_group,ethnic_mode,income,income_mode) VALUES ('2','asian','asian','middle','middle'); 
INSERT INTO mytable(id,ethnic_group,ethnic_mode,income,income_mode) VALUES ('2','mixed','asian','middle','middle'); 
INSERT INTO mytable(id,ethnic_group,ethnic_mode,income,income_mode) VALUES ('2','asian','asian','middle','middle'); 

答えて

0

私は1つのinsert文でこれを達成するために、サブクエリを使用します。ここで

は、あなたのイラストからテーブル構造に基づいた例である:

/* This is the original table and contains duplicate ID's */ 
DECLARE @source_table TABLE(
    id  VARCHAR(2) NOT NULL 
    ,ethnic_group VARCHAR(12) NULL 
    ,ethnic_mode VARCHAR(11) NULL 
    ,income VARCHAR(6) NULL 
    ,income_mode VARCHAR(11) NULL 
); 

/* This is the destination table and will not contain duplicate ID's */ 
DECLARE @destination_table TABLE(
    id  VARCHAR(2) NOT NULL PRIMARY KEY 
    ,ethnic_group VARCHAR(12) NULL 
    ,income VARCHAR(6) NULL 
); 

/* Populate the source table with data */ 
INSERT INTO @source_table(id,ethnic_group,ethnic_mode,income,income_mode) VALUES ('1','white','white','middle','middle'); 
INSERT INTO @source_table(id,ethnic_group,ethnic_mode,income,income_mode) VALUES ('1','white','white','middle','middle'); 
INSERT INTO @source_table(id,ethnic_group,ethnic_mode,income,income_mode) VALUES ('1','mixed','white','high','middle'); 
INSERT INTO @source_table(id,ethnic_group,ethnic_mode,income,income_mode) VALUES ('2','asian','asian','middle','middle'); 
INSERT INTO @source_table(id,ethnic_group,ethnic_mode,income,income_mode) VALUES ('2','mixed','asian','middle','middle'); 
INSERT INTO @source_table(id,ethnic_group,ethnic_mode,income,income_mode) VALUES ('2','asian','asian','middle','middle'); 
INSERT INTO @source_table(id,ethnic_group,ethnic_mode,income,income_mode) VALUES ('3','asian', NULL, NULL, NULL); 
INSERT INTO @source_table(id,ethnic_group,ethnic_mode,income,income_mode) VALUES ('3',NULL, NULL,'middle', NULL); 
INSERT INTO @source_table(id,ethnic_group,ethnic_mode,income,income_mode) VALUES ('3',NULL, NULL, NULL, NULL); 

/* Insert from source into destination (removing duplicates) */ 
INSERT INTO @destination_table 
     (
      id 
     , ethnic_group 
     , income 
     ) 
SELECT st.id 
    , (
     SELECT TOP 1 ethnic_group 
     FROM @source_table sub_st 
     WHERE sub_st.id = st.id 
     GROUP BY ethnic_group 
     ORDER BY COUNT(sub_st.id) DESC 
    ) 
    , (
     SELECT TOP 1 income 
     FROM @source_table sub_st 
     WHERE sub_st.id = st.id 
     GROUP BY income 
     ORDER BY COUNT(sub_st.id) DESC 
    ) 
FROM @source_table st 
GROUP BY st.id 


/* View the destination to see there are no duplicates */ 
SELECT id 
     , ethnic_group 
     , income 
FROM @destination_table 
+0

私はNULL値を含める(そう、彼らはほとんどがnullの場合、モードはまだNULLです)。実際のデータでこれを試したところ、NULLは無視され、モードはNULL以外の値のみに基づいて割り当てられました。 – user2964644

+0

@ user2964644私はNULL値を処理するために私の答えを更新しました。 –

関連する問題