Postgresql按日期排序但随机排列

时间:2013-04-01 16:22:12

标签: sql 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中执行此操作吗?

4 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

所以,你想把每一天组合在一起,但日期以随机顺序呈现,对吧?我们可以使用内置函数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();

答案 2 :(得分:0)

我认为以下内容可行:

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();

这是您的示例数据的结构。

答案 3 :(得分:0)

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

首先将日期截断为月份并对其进行排序。因此,2012-01-25和2012-01-13成为2012-01-01。

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