Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL中计算相对频率_Sql_Left Join_Probability_Frequency Distribution - Fatal编程技术网

在SQL中计算相对频率

在SQL中计算相对频率,sql,left-join,probability,frequency-distribution,Sql,Left Join,Probability,Frequency Distribution,我正在开发一个标签推荐系统,该系统采用对象的元数据字符串(例如文本描述),并将其拆分为1、2和3克 该系统的数据保存在3个表中: “对象”表(例如所描述的内容) “代币”表,填写所有发现的1克、2克和3克(以下示例),以及 “映射”表,它维护(1)和(2)之间的关联,以及这些事件的频率计数 因此,我能够通过左连接构造一个表,看起来有点像这样: SELECT mapping.object_id, mapping.token_id, mapping.freq, token.token_size, t

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

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

  • “对象”表(例如所描述的内容)
  • “代币”表,填写所有发现的1克、2克和3克(以下示例),以及
  • “映射”表,它维护(1)和(2)之间的关联,以及这些事件的频率计数
  • 因此,我能够通过左连接构造一个表,看起来有点像这样:

    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的上下文中获得每个术语的相对概率,以便我可以按概率对它们进行排序,并查看哪些术语最有可能(例如,
    ORDER by rel_prob DESC LIMIT 25

    对于每一行,我设想添加一列,给出给定令牌大小的
    freq/所有freq之和的结果。例如,在“大”的情况下,这将是
    1/(1+3)=0.25
    。对于“a”,这是
    1/3=0.333
    ,等等


    我不能,为了我的生命,想出如何做到这一点。非常感谢您的帮助

    如果我理解你的问题,下面是你需要的问题

    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;
    


    希望对您有所帮助

    太棒了!工作得很有魅力!我甚至不知道窗口函数!谢谢