Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Поиск наиболее часто встречающегося подмножества с помощью Select  [new]
LIKAN_BLK
Member

Откуда:
Сообщений: 9
Есть таблица вида:
id letter
1 a
1 b
1 c
2 a
2 b
2 c
3 a
3 c
Задача - выделить среди множеств abc, abc,ac(т е буквы принадлежащие id с одним и тем же значением)
наиболее часто встречающееся подмножество(Здесь -ac) Вторые сутки бьюсь и никаких идей....
10 май 12, 20:50    [12532731]     Ответить | Цитировать Сообщить модератору
 Re: Поиск наиболее часто встречающегося подмножества с помощью Select  [new]
qwerty112
Guest
LIKAN_BLK,

+
declare @t table (id int, letter varchar(max))

insert into @t

select 1, 'a' union all
select 1, 'b' union all
select 1, 'c' union all
select 2, 'a' union all
select 2, 'b' union all
select 2, 'c' union all
select 3, 'a' union all
select 3, 'c'

;with cte as
(select id, letter as xz from @t
union all
select cte.id, cte.xz + t.letter
from cte inner join @t t 
  on cte.id=t.id and cte.xz<t.letter 
where cte.xz not like '%'+t.letter+'%')

select top 1 /*with ties*/ cte.xz, count(*) as xz1
from cte
group by cte.xz
order by count(*) desc, len(cte.xz) desc

(8 row(s) affected)
xz    xz1
----- -----------
ac    3

(1 row(s) affected)
10 май 12, 21:11    [12532825]     Ответить | Цитировать Сообщить модератору
 Re: Поиск наиболее часто встречающегося подмножества с помощью Select  [new]
aleks2
Guest
declare @t table(id int,  letter char)

insert @t (id, letter)
select 1, 'a'
union all
select 1, 'b'
union all
select 1, 'c'
union all
select 2, 'a'
union all
select 2, 'b'
union all
select 2, 'c'
union all
select 3, 'a'
union all
select 3, 'c'


select letter, count(*) cnt
from @t
group by letter
having count(*) = (select max( cnt) from (select count(*) cnt from @t group by letter) X)
11 май 12, 11:56    [12535189]     Ответить | Цитировать Сообщить модератору
 Re: Поиск наиболее часто встречающегося подмножества с помощью Select  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
aleks2, не усе так просто.
+ тут
;WITH    t ( id, letter )
          AS (  select 1, CAST('d' AS VARCHAR(MAX))
				union all
				select 1, 'b'
				union all
				select 1, 'c'
				union all
				select 2, 'a'
				union all
				select 2, 'b'
				union all
				select 2, 'c'
				union all
				select 3, 'a'
				union all
				select 3, 'd'
             ),
        cte
          AS ( SELECT   id
                       ,letter AS xz
               FROM     t
               UNION ALL
               SELECT   cte.id
                       ,cte.xz + t.letter
               FROM     cte
                        INNER JOIN t t
                        ON cte.id = t.id
                           AND cte.xz < t.letter
               WHERE    cte.xz NOT LIKE '%' + t.letter + '%'
             )
    --SELECT TOP 1 /*with ties*/
    --        cte.xz
    --       ,COUNT(*) AS xz1
    --FROM    cte
    --GROUP BY cte.xz
    --ORDER BY COUNT(*) DESC
    --       ,LEN(cte.xz) DESC
	SELECT  letter
		   ,COUNT(*) cnt
	FROM    t
	GROUP BY letter
	HAVING  COUNT(*) = ( SELECT MAX(cnt)
						 FROM   ( SELECT    COUNT(*) cnt
								  FROM      t
								  GROUP BY  letter
								) X
					   )
11 май 12, 12:21    [12535368]     Ответить | Цитировать Сообщить модератору
 Re: Поиск наиболее часто встречающегося подмножества с помощью Select  [new]
aleks2
Guest
kDnZP
aleks2, не усе так просто.


Я, какгбе, догадываюсь. Тока тредстартер не огласил полной постановки.
А "как ему нада" - так проще.
11 май 12, 13:41    [12536076]     Ответить | Цитировать Сообщить модератору
 Re: Поиск наиболее часто встречающегося подмножества с помощью Select  [new]
smallserg
Member

Откуда:
Сообщений: 82
LIKAN_BLK,

Все представленные выше решения на данных
select 1,'x'  
union all select 1,'b'
union all select 2,'d'
union all select 2,'b'
union all select 2,'e'
union all select 3,'b'
union all select 3,'d'
union all select 3,'e'
union all select 4,'d'
union all select 4,'b'
union all select 4,'e'


дают ответ " b 4 ". Что, скорее всего, не соответствует постановке задачи.

Предлагаю свой вариант :

declare  @t table (id2 int,val varchar(max))
insert @t (id2,val)
select 1,'x' 
union all select 1,'b'
union all select 2,'d'
union all select 2,'b'
union all select 2,'e'
union all select 3,'b'
union all select 3,'d'
union all select 3,'e'
union all select 4,'d'
union all select 4,'b'
union all select 4,'e'
/*select 1, 'a' union all
select 1, 'b' union all
select 1, 'c' union all
select 2, 'a' union all
select 2, 'b' union all
select 2, 'c' union all
select 3, 'a' union all
select 3, 'c' */
;with Comb (Val,id2) AS (
	SELECT val,id2 from @t
UNION ALL
	SELECT	case when C.Val>s.val then c.val else s.val end + case when C.Val<s.val then c.val else s.val end
,s.id2
	FROM	@t S JOIN Comb C ON S.val >C.val and S.id2=c.id2
    where c.val not like ('%'+s.val+'%')
)
select distinct val,cnt from
  (SELECT top 1 with ties  Val,count(id2) over(partition by val) Cnt FROM Comb  where len(val)>1
order by count(id2) over(partition by val) desc) ff
option (maxrecursion 0)
11 май 12, 16:01    [12537546]     Ответить | Цитировать Сообщить модератору
 Re: Поиск наиболее часто встречающегося подмножества с помощью Select  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
smallserg
дают ответ " b 4 ". Что, скорее всего, не соответствует постановке задачи.

ИМХО вполне соответствует. В вашем же случае не совсем ясна логика, т.к. односимвольное подмножество вполне тоже допустимо.
11 май 12, 16:27    [12537781]     Ответить | Цитировать Сообщить модератору
 Re: Поиск наиболее часто встречающегося подмножества с помощью Select  [new]
smallserg
Member

Откуда:
Сообщений: 82
LIKAN_BLK
Есть таблица вида:
id letter
1 a
1 b
1 c
2 a
2 b
2 c
3 a
3 c
Задача - выделить среди множеств abc, abc,ac(т е буквы принадлежащие id с одним и тем же значением)
наиболее часто встречающееся подмножество(Здесь -ac)


Не " a, c и ac ", а именно что только "ac"
11 май 12, 16:34    [12537821]     Ответить | Цитировать Сообщить модератору
 Re: Поиск наиболее часто встречающегося подмножества с помощью Select  [new]
LIKAN_BLK
Member

Откуда:
Сообщений: 9
Первая версия вполне рабочая, другое дело я подумал что если заменить буквы на цифры, каким нибудь вот таким образом
id1 id2
1 1
1 2
1 12
2 1
2 2
2 12
3 1
3 12
Все инты, то такой подход уже не прокатит, так как мы уже не отличим проканкатенированые 1 и 2 от 12. Я пытался преобразовывать int к char(3) например, чтоб цифру пробелы окружали, но там тоже ничего хорошего не получилось
Хотелось бы что-нить более универсальное
12 май 12, 23:05    [12544824]     Ответить | Цитировать Сообщить модератору
 Re: Поиск наиболее часто встречающегося подмножества с помощью Select  [new]
LIKAN_BLK
Member

Откуда:
Сообщений: 9
smallserg,

Да вы пожалуй правы, я не до конца описал постановку задачи, первый приоритет найти наиболее часто встречающееся подмножество, а если таких подмножеств несколько, то из них выбрать самое длинное, но первый вариант вроде как выполнянл сортировку по длине, и отдавал приоритет самым длинным
12 май 12, 23:58    [12544962]     Ответить | Цитировать Сообщить модератору
 Re: Поиск наиболее часто встречающегося подмножества с помощью Select  [new]
qwerty112
Guest
ТС - жив !
LIKAN_BLK
...
Хотелось бы что-нить более универсальное

declare @t table (id int, letter int)

insert into @t

select 1, 1 union all
select 1, 2 union all
select 1, 12 union all
select 2, 1 union all
select 2, 2 union all
select 2, 12 union all
select 3, 1 union all
--select 3, 12 union all
select 3, 2

--

;with cte as
(select id, '-'+cast(letter as varchar(max))+'-' as xz, 1 as [level] 
from @t

union all

select cte.id, cte.xz + cast(t.letter as varchar(max))+'-', cte.[level]+1
from cte inner join @t t 
  on cte.id=t.id and cte.xz<cast(t.letter as varchar(max)) 
where cte.xz not like '%-'+cast(t.letter as varchar(max))+'-%')

select top 1 /*with ties*/ cte.xz, count(*) as xz1, cte.[level]
from cte
group by cte.xz,cte.[level]
order by count(*) desc, cte.[level] desc

xz     xz1         level
----- ----------- -----------
-1-2-  3           2
13 май 12, 08:30    [12545275]     Ответить | Цитировать Сообщить модератору
 Re: Поиск наиболее часто встречающегося подмножества с помощью Select  [new]
qwerty112
Guest
даже так
;with cte as
(select id, '-'+cast(letter as varchar(max))+'-' as xz, 1 as [level], letter as last_item 
from @t

union all

select cte.id, cte.xz + cast(t.letter as varchar(max))+'-', cte.[level]+1, t.letter
from cte inner join @t t 
  on cte.id=t.id and cte.last_item<t.letter
--where cte.xz not like '%-'+cast(t.letter as varchar(max))+'-%'
)

select top 1 /*with ties*/ cte.xz, count(*) as xz1, cte.[level]
from cte
group by cte.xz,cte.[level]
order by count(*) desc, cte.[level] desc
13 май 12, 08:42    [12545279]     Ответить | Цитировать Сообщить модератору
 Re: Поиск наиболее часто встречающегося подмножества с помощью Select  [new]
заинтересовался задачей
Guest
товарищи, очень интересная задачка.

я вот не знаю стe. без сте её решить реально?
14 май 12, 20:02    [12553018]     Ответить | Цитировать Сообщить модератору
 Re: Поиск наиболее часто встречающегося подмножества с помощью Select  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
заинтересовался задачей
её решить реально?
Разрешаю попробовать.
14 май 12, 21:51    [12553348]     Ответить | Цитировать Сообщить модератору
 Re: Поиск наиболее часто встречающегося подмножества с помощью Select  [new]
заинтересовался задачей
Guest
Mnior, ты не умничай. Ты лучше свое решение предложи.
15 май 12, 09:47    [12554213]     Ответить | Цитировать Сообщить модератору
 Re: Поиск наиболее часто встречающегося подмножества с помощью Select  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
заинтересовался задачей
Mnior, ты не умничай. Ты лучше свое решение предложи.

А вообще понаоткуда понабигали? Сессия или таки что-то типа sql-ex? Решение есть конечно, но вот даже эту ссылку давать не хотелось(((. Такое ощущение что что-то плохое делаю, но обосновать не могу.
15 май 12, 10:58    [12554713]     Ответить | Цитировать Сообщить модератору
 Re: Поиск наиболее часто встречающегося подмножества с помощью Select  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
заинтересовался задачей
Ты лучше свое решение предложи.
Не думаю что от этого ты станешь умнее, получишь новые навыки.

Знания можно добыть только собстенным трудом. В голову никто засунуть за тебя не сможет. Ни одого бита.

Если тебе так нтересно, но не получается, то спроси в чём проблема, в чём заговзда, почему нельзя и т.п.
Разложи задачу на куски. Попробуй её расписать словами / формализовать.

kDnZP, чё тут обосновывать, учение это не предоставлении ответа. Это обучение самостоятельному мышлению.

http://habrahabr.ru/post/142623/#comment_4776013
Поиск -> индукция -> инсайт.
Прикольное видео, хоть и замашками. ;)
15 май 12, 15:51    [12557777]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить