1

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

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

4 回答 4

1

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

select * from 
(select somefields
from sometables
order by article_date_added desc
limit 30) temp
order by random()
于 2013-04-01T16:34:13.283 回答
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();
于 2013-04-02T16:53:34.720 回答
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();

这就是您的示例数据的结构方式。

于 2013-04-01T16:27:07.437 回答
0
select DATE
from TABLE 
order by date_trunc('month',DATE),
random()

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

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

于 2013-04-01T20:42:30.973 回答