我试图提取数据并按日期排列,但让它以随机顺序出现。我试过
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。
之后,对实际日期进行随机排序。