因此,我需要从表格中选择一堆文档ID和值,然后根据值为每个文档ID赋予权重。它的工作原理如下:
假设该表具有值:
DocID Value
1 1
1 1
2 1
2 2
选择将选择每个唯一的DocID,然后为其赋予权重值。具有相同值的文档重复两次将比具有2个不同值的文档具有更少的权重。所以输出将是这样的:
DocID Weight
1 1.5
2 2
正如你所看到的那样,由于文件1的重复值为1,因此它将从第一个值开始加权+1,然后重复+0.5,因为它重复一次(如果值重复超过,则会再次获得+0.5) 。然后,文档2的权重为2,因为值1出现一次(+1),值2出现一次(+2)
任何帮助都将受到高度赞赏。
答案 0 :(得分:2)
首先,聚合数据以获得每个文档/值的计数。然后,如果我正确理解逻辑,其余的只是一个加法聚合:
select docid,
sum(case when cnt > 1 then 1 + 0.5 * (cnt - 1) else 0 end)
from (select docid, value, count(*) as cnt
from t
group by docid, value
) dv
group by docid;
实际上,我认为外部查询可以简化为:
select docid,
0.5 + 0.5 * sum(cnt)
而且,整个事情可以用count(distinct)
表示:
select docid,
(0.5 * count(distinct value) +
0.5 * count(*)
)
from t
group by docid;
答案 1 :(得分:0)
试试这个,
declare @t table(DocID int, Value int)
insert into @t values
(1, 1)
,(1, 1)
,(2, 1)
,(2, 2)
;
WITH CTE
AS (
SELECT docid
,value
,ROW_NUMBER() OVER (
PARTITION BY docid ORDER BY docid
) rownum
FROM @t
)
,CTE1
AS (
SELECT docid
,value
,rownum
,1.00 wtg
FROM cte
WHERE rownum = 1
UNION ALL
SELECT a.docid
,b.value
,b.rownum + 1
,CASE
WHEN a.Value = b.value
THEN 0.50
ELSE 1
END
FROM CTE A
INNER JOIN cte1 B ON a.docid = b.DocID
AND A.rownum > b.rownum
)
SELECT docid
,SUM(wtg) wtg
FROM cte1
GROUP BY docid