PostgreSQL:根据频率

时间:2015-06-03 11:25:16

标签: sql postgresql postgresql-9.4

我遇到了复杂的订购问题。我有以下示例数据:

table "categories"
id | frequency
 1 |     0
 2 |     4
 3 |     0

table "entries"
id | category_id | type
 1 |       1     |   a
 2 |       1     |   a
 3 |       1     |   a
 4 |       2     |   b
 5 |       2     |   c
 6 |       3     |   d

我想将entries行放入订单中,以便category_id, 并type均匀分配。

更确切地说,我想以下列方式订购entries

    引用category_ids = 0的category
  1. frequency是 均匀分布 - 以便一行后跟不同的category_id 只要有可能。例如行category_ids:1,2,1,3,1,2。

  2. category_ids categories frequency<> 0的行应该是 从ca.插入从它们之间的最小频率行开始 (差距应该有所不同)。在我的示例中,这些是category_id = 2的行。 因此结果可以从行号#1开始,然后是#4,然后是至少4行其他行 categories,然后是#5。

  3. 在最终结果中,具有相同type的行不应该彼此相邻。

  4. 示例结果:

    id | category_id | type
     1 |       1     |   a
     4 |       2     |   b
     2 |       1     |   a
     6 |       3     |   d
     .. some other row ..
     .. some other row ..
     .. some other row ..
     5 |       2     |   c
    

    entries就像是用户获得的东西(一次一个)。 整个订单应该给用户一些变化。它就在那里 一直向他们展示类似的作品,所以它不一定是完美的。 查询也不必在每次调用时给出相同的结果 - 使用 random()完全没问题。

    frequencies可以让某些类别的entries更高一些 优先级使它们不是分布在整个范围内,而是放置得更多 在结果列表的开头。即使有很多这些条目,他们 不应该完全挤出开头的frequency = 0条目,通过。

    我不知道如何开始这个。我想我可以使用窗口函数和 ntile()category_idtype分配行。 但我不知道如何在之后插入非0类别的条目。

0 个答案:

没有答案