按几列排序

时间:2019-05-27 09:48:39

标签: sql postgresql

我想定期更新数据库中的行,但也希望更受欢迎的行(请求更多的行)更频繁地更新。我以为我可以基于两个参数:人气和自上次更新以来的时间。

id | title | popularity | last_updated
---+-------+------------+-------------
1  | A     | 148        | 20190501
2  | B     | 3874       | 20190201
3  | C     | 29         | 20190104
4  | D     | 242        | 20190314
5  | E     | 398        | 20190325
6  | F     | 3          | 20190128

last_updated列的格式为YYYYMMDD

我首先以为我可以简单地使用ORDER BY

SELECT * FROM results ORDER BY last_updated, popularity;

但是,如果两行或更多行的last_updated的值相同,则此查询仅关心popularity列。

是否有可能将popularitylast_updated变成另一个可以用于这种排序的值?

3 个答案:

答案 0 :(得分:0)

难点在于定义受欢迎程度和最新更新之间的重要性级别。

如何计算人气值?它会减少吗?大多数主题在一段时间(流行)中很受欢迎,并很快成为老新闻。为了知道当前的记录流行度,我建议保留额外的一栏popularityOnUpdate,该列保留上次更新时的流行度值。当受欢迎程度降低时,受欢迎程度值的增量将消失,因此PopularOnUpdate值和受欢迎程度值之间的差异。

查询可以变为:

order by POP_WEIGHT*(popularity - popularityOnUpdate)
       + UPD_WEIGHT*(current date - lastUpdate) DESCENDING

POP_WEIGHT和UPD_WEIGHT是必须定义的常数,它们表示2个条件(受欢迎程度和最新更新)的重要性。流行度降低后,最后一次更新的值将使该记录在排名中上升。

答案 1 :(得分:0)

当然,有很多方法可以选择公式,以将人气和last_update合并为一个值进行排序。因此,这更多是模板,而不是现成的答案

仅使用流行度,我们可以使用random()函数为流行度添加一个因素

SELECT * 
FROM results 
ORDER BY popularity * random() DESC

对于日期,从今天减去它,然后对该结果使用random()是有意义的,因此,如果我们将其相加

SELECT * 
FROM results 
ORDER BY popularity * random() - (current_date - last_updated) * random() DESC

正如评论中指出的那样,我可能误解了last_update的优先级,因此,如果较旧的更新更有可能被更新,则切换符号

SELECT * 
FROM results 
ORDER BY popularity * random() + (current_date - last_updated) * random()

所以现在我们从上次更新中减去天数,以便新更新的值更高,但是再次使用random(),以便不给出顺序。这可以作为一个开始,但是我不确定这两个部分之间的平衡是否良好,或者可能取决于流行度与last_updated对结果的影响程度,是否需要将其中之一乘以某个因素。

然后,还可以向SELECT添加一个LIMIT,甚至可以将该值乘以random()

答案 2 :(得分:-1)

您的查询为真

table.buttons().container().appendTo( '#dynamic_table_wrapper .col-md-6:eq(0)' );

它将按last_updated升序排序,如果您重复了last_updated列的值,则会按受欢迎程度排序

只要看到这个答案,您就会了解我 SQL multiple column ordering