【问题标题】:SQLITE Many to Many Relationship Frequency CountSQLITE 多对多关系频率计数
【发布时间】:2019-11-20 20:03:52
【问题描述】:

我在 SQLITE 数据库中有三个表,分别称为 Needle、NeedleHaystack 和 Haystack,它们用于多对多关系连接表。我需要计算 needle 中每个独特项目的频率,它在每个独特 Haystack 中出现的频率(最好是百分比,计数是可以接受的)。

  Needle          NeedleHaystack                    Haystack
  +----+-------+  +----+-----------+-------------+  +----+-------+
  | id | value |  | id | needle_id | haystack_id |  | id | value |
  +----+-------+  +----+-----------+-------------+  +----+-------+
  |  1 |  foo1 |  | 1  |    1      |     7       |  | 7  |  bar7 |
  |  2 |  foo2 |  | 2  |    1      |     8       |  | 8  |  bar8 |
  |  3 |  foo3 |  | 3  |    1      |     9       |  | 9  |  bar9 |
  +----+-------+  | 4  |    2      |     7       |  +----+-------+
                  +----+-----------+-------------+

这样我们最终会得到这样的结果

  +-----------+--------------------------+
  | needle_id | frequency_over_haystacks |
  +-----------+--------------------------+
  |    1      |          100%            | // needle id 1 appears in 100% of Haystacks
  |    2      |           33%            | // needle id 2 appears in 33% of Haystacks
  |    3      |            0%            | // needle id 3 appears in no Haystacks
  +-----------+--------------------------+ // on and on, for each needle that may be present...

【问题讨论】:

  • 为什么针 1 的百分比不是 100%?
  • 很好,已修复。

标签: sql sqlite orm subquery


【解决方案1】:

我认为你基本上想要聚合:

select n.needle_id, count(distinct nh.haystack_id) * 1.0 / h.cnt
from needle n left join
     needlehaystack nh
     on n.needle_id = nh.needle_id cross join
     (select count(*) as cnt from haystack) h
group by n.needle_id, h.cnt;

这允许在needlehaystack 中重复。如果不允许,则在select 中使用count(*) 而不是count(distinct)

【讨论】:

  • 你能多谈谈你对重复的评论吗?我认为您已经一针见血,但我想确保我理解您的意思。我想我知道,但我想确保您只是说如果有重复的行具有相同的 needle_id 和 haystack_id 并且我不希望它们被多次计算,请使用 count(*) * 1.0 / h.cnt 而不是 @987654327 @
  • 另外,结果是实际百分比还是十进制版本?例如。 .3535.0
  • @MichaelScott 。 . .这将返回 0 和 1 之间的比率。如果需要百分比,请乘以 100.0 而不是 1.0。您对重复项的观察是正确的。这只会计算一次。
猜你喜欢
  • 1970-01-01
  • 2014-08-04
  • 1970-01-01
  • 2014-01-26
  • 1970-01-01
  • 1970-01-01
  • 2015-11-11
  • 2021-12-27
  • 1970-01-01
相关资源
最近更新 更多