Postgresql按日期随机排序



我试图提取数据并按日期排列,但让它以随机顺序出现。我试过

SELECT * FROM table ORDER BY article_date_added::DATE DESC, RANDOM() limit 30;

我试过

SELECT * FROM table ORDER BY to_timestamp(to_char(article_date_added, 'DD Mon YYYY HH24'), 'DD Mon YYYY') DESC, RANDOM()

它得到了最新的文章,但后来它每天都是随机的。所以它会像一样

April 1
March 29
March 31
Apr 1

我试着按照日期来计算结果,但结果是随机的。

April 1
April 1
March 31
March29

有没有一种方法可以在SQL中做到这一点?

所以,你希望每天都分组在一起,但日期以随机顺序显示,对吧?我们可以使用内置函数generate_series,它可以使用时间戳参数来制作一个伪表,这会有所帮助。

WITH t AS (
  SELECT gs::date AS dt, random() AS r 
  FROM generate_series('2010-01-01'::timestamp, '2015-01-01', '1 day') AS gs )
SELECT articles.* 
FROM articles JOIN t 
ON articles.article_date_added::date=t.dt 
ORDER BY r;

请注意,输出列中没有必要包含r

显然,这个代码只能再工作2年9个月,但必要的修改应该是显而易见的。您甚至可以用(SELECT min(article_date_added) FROM articles)(注意额外的括号!(和max替换硬连接日期。


[评论后编辑]在查看您的示例输出时,我发现您不希望按日期进行聚合。我不确定描述是否与输出相符。你所要求的可能在其他建议中,但你可以用轻松完成

WITH t AS (
  SELECT * FROM articles
  ORDER BY article_created_date DESC LIMIT 30 )
SELECT * FROM t ORDER BY t.article_created_date desc, random();

将获得30篇最新文章的部分放入子查询中,然后从子查询中随机选择。我不使用postgresql,所以这个例子可能有一些错误:

select * from 
(select somefields
from sometables
order by article_date_added desc
limit 30) temp
order by random()

我认为以下方法会起作用:

select t.*
from (select t.*,
             avg(random()) over (partition by article_date_added::DATE) as groupnum
      from t
     ) t
order by groupnum;

或者,如果你想让日期下降,然后随机做:

select t.*
from t
order by article_date_added::DATE desc, random();

这就是示例数据的结构。

select DATE
from TABLE 
order by date_trunc('month',DATE),
random()

这是通过首先将日期截断到月份并进行排序来实现的。因此,2012-01-25和2012-01-13变成了2012-01-01。

之后,对实际日期进行随机排序。

最新更新