计算SQL中的相对频率

时间:2013-08-10 20:50:51

标签: sql left-join probability frequency-distribution

我正在开发一个标记推荐系统,它采用对象的元数据字符串(例如文本描述),并将其分为1,2和3克。

该系统的数据保存在3个表中:

  1. “对象”表格(例如正在描述的),
  2. “令牌”表格中填充了所有找到的1克,2克和3克(以下示例),
  3. “映射”表,它维护(1)和(2)之间的关联,以及这些事件的频率计数。
  4. 因此,我可以通过LEFT JOIN构建一个表,看起来有点像这样:

    SELECT mapping.object_id, mapping.token_id, mapping.freq, token.token_size, token.token
    FROM mapping LEFT JOIN
         token
         ON (mapping.token_id = token.id)
    WHERE mapping.object_id = 1;
    
      object_id   token_id   freq   token_size   token
    +-----------+----------+------+------------+--------------
      1           1          1      2            'a big'
      1           2          1      1            'a'
      1           3          1      1            'big'
      1           4          2      3            'a big slice'
      1           5          1      1            'slice'
      1           6          3      2            'big slice'
    

    现在我希望能够在单个对象ID的上下文中获得每个术语的相对概率,以便我可以按概率对它们进行排序,并查看最可能的术语(例如{{1} })

    对于每一行,我设想添加一个列,其中给出ORDER BY rel_prob DESC LIMIT 25的结果。例如,在“大”的情况下,那将是freq/sum of all freqs for that given token_size。对于'a',那是1/(1+3) = 0.25等等。

    对于我的生活,我不能弄清楚如何做到这一点。非常感谢任何帮助!

1 个答案:

答案 0 :(得分:2)

如果我理解你的问题,这是你需要的查询

select
    m.object_id, m.token_id, m.freq,
    t.token_size, t.token,
    cast(m.freq as decimal(29, 10)) / sum(m.freq) over (partition by t.token_size, m.object_id)
from mapping as m
    left outer join token on m.token_id = t.id
where m.object_id = 1;

sql fiddle example

希望有所帮助