Я очищаю записи, которые с плохо записанной и непоследовательной социально-демографической информацией со временем, для одного и того же человека. Я хочу использовать наиболее часто используемое значение (режим) для каждого человека.Принимая наиболее часто встречающееся (модальное) значение для нескольких столбцов
Один из способов сделать это является разделение по идентификатору, а затем подсчитать, сколько раз встречается каждое значение, сохраняя при этом высокий счетчик для каждого ID:
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
Но я хочу сделать это для нескольких переменных (этнических группа, группа доходов и еще несколько).
Как выбрать режим для нескольких переменных внутри одного оператора и вставить в одну таблицу (вместо создания отдельных таблиц для каждой переменной)?
В таблице ниже приведен пример того, что я хочу сделать:
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');
Я хочу включить NULL значения (так что, если они в основном нуль, режим по-прежнему NULL). Когда я попробовал это на реальных данных, NULL был проигнорирован, и режим был назначен только на основе NULL. – user2964644
@ user2964644 Я обновил свой ответ, чтобы обрабатывать значения NULL. –