从表中选择唯一记录并赋予重复权重

时间:2015-12-27 14:01:41

标签: sql sql-server

因此,我需要从表格中选择一堆文档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)

任何帮助都将受到高度赞赏。

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