#c# #sql-server-2008 #ssas #decision-tree
#c# #sql-server-2008 #ssas #дерево решений
Вопрос:
Я создаю приложение на C #. Я объясню, чего я хочу, приведя простой пример:
рассмотрим эту таблицу:
name age reply choice
------ ------- ------- -------
John 10-20 yes apple
Kate 20-30 yes orange
Sam 10-20 yes apple
Peter 10-20 no ----
Tom 20-30 no ----
Mike 10-20 yes orange
Я хотел бы составить дерево решений с прогнозируемым «возрастом» для всех ответивших пользователей. а затем спрогнозируйте выбор тех, кто не ответил.
Таблица сохраняется в базе данных SQL Server 2008. И в SQL Server 2008 есть функция, которая позволяет это делать. Я искал на веб-сайте справки Microsoft, но не нашел никакого четкого руководства о том, как его использовать.
Как я могу использовать это в своем коде на C #, у кого-нибудь есть пошаговое руководство по этому поводу?
Комментарии:
1. Не могли бы вы рассказать, может быть, какая функция 2008 есть именно для этого, потому что мне это ничего не говорит .. также, каков ожидаемый результат для этого примера? Яблоко для Питера и апельсин для Тома? Вы могли бы сделать это с помощью относительно простого запроса. Нужно немного больше, чтобы иметь возможность помочь здесь.
2. Здравствуйте, спасибо за ваш ответ. Да, результатом будет apple для Питера (потому что большинство «10-20» хотели яблоко и апельсин для Тома). Функция, о которой я говорил, описана по этой ссылке msdn.microsoft.com/en-us/library/ms175312.aspx . Также, если это можно сделать с помощью запроса, можете ли вы помочь мне с этим? Мне все равно, что я использую, мне просто нужны результаты. Большое вам спасибо
Ответ №1:
Это помогло бы:
-- create table
declare @t table (name varchar(50), age varchar(50), reply varchar(3), answer varchar(50))
insert @t (name, age, reply, answer)
values ('John', '10-20', 'yes', 'apple'),
('Kate', '20-30', 'yes', 'orange'),
('Sam', '10-20', 'yes', 'apple'),
('Peter', '10-20', 'no', '----'),
('Tom', '20-30', 'no', '----'),
('Mike', '10-20', 'yes', 'orange')
-- get answer
select t.name, t.age, t.reply, case t.reply when 'yes' then t.answer else w.answer end answer
from @t t
left join (
select age, answer
from (
select age, answer, count(*) cnt, row_number() over (partition by age order by count(*) desc) rnk
from @t
where reply = 'yes'
group by age, answer
) s
where rnk = 1
) w on t.age = w.age
Просто выясните, какой ответ был предоставлен чаще всего для каждого возраста, а затем выберите этот ответ, если его не было дано.
Когда есть связь между двумя ответами, он просто выбирает один. Я думаю, что тот, который приходит первым, но нет никаких гарантий, что он всегда будет это делать.
Имейте в виду, что если у вас есть группа, в которой ответы A: B = 55%: 45%, то все люди, у которых нет ответа, получают ответ A, поэтому вы изменили бы средние значения населения, сделав это. Просто чтобы вы знали.