我正在尝试提取数据并按日期排列,但让它以随机顺序显示。我试过了
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中执行此操作吗?
答案 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。
之后,随机排序实际日期。