【问题标题】:SQL sort that distributes results分配结果的 SQL 排序
【发布时间】:2012-12-03 22:29:12
【问题描述】:

给定一张这样的产品表:

ID Name     Seller ID  Updated at
-- ----     ---------  ----------
1  First      3         2012-01-01 12:00:10
2  Second     3         2012-01-01 12:00:09
3  Third      4         2012-01-01 12:00:08
4  Fourth     4         2012-01-01 12:00:07
5  Fifth      5         2012-01-01 12:00:06

我想构造一个查询来对产品进行排序,如下所示:

ID
---
1
3
5
2
4

换句话说,查询应该显示最近更新的产品,由卖家分发,以尽量减少来自同一卖家的连续产品序列的可能性。

关于如何最好地实现这一点的任何想法? (请注意,此应用程序的代码是 Ruby,但如果可能的话,我想在纯 SQL 中执行此操作)。

编辑:

请注意,查询也应该处理这种情况:

ID Name     Seller ID  Updated at
-- ----     ---------  ----------
1  First      3         2012-01-01 12:00:06
2  Second     3         2012-01-01 12:00:07
3  Third      4         2012-01-01 12:00:08
4  Fourth     4         2012-01-01 12:00:09
5  Fifth      5         2012-01-01 12:00:10

产生以下结果:

ID
---
5
4
2
3
1

【问题讨论】:

  • @Ben 我正在使用 Postgres。谢谢。
  • 下一个问题:-)。假设您为卖家 3 添加了四行,ID 为 6-9,日期与您的顺序相同。现在的订单是 1, 3, 5, 2, 4, 6, 7, 8, 9,即当少数卖家的商品比其他人多得多时,尾端会发生什么。
  • 是的,您的顺序正确。在这种情况下,卖家 3 最旧的产品将被排序到结果集的末尾。
  • 只是想知道如果卖家长时间不更新他们的产品会发生什么。在您的第二个示例中,假设卖家 5 上次更新他们的产品是在 2011 年 12 月 1 日。那还应该排在产品 2 和 4 之上吗?
  • @kburkhardt 抱歉,我的数字弄错了。如果卖家 5 最后一次更新他们的产品是在 2011 年 12 月 1 日,那么答案应该是 4、2、5、3、1 吗?如果是这样,我认为这就是贾斯汀凯夫的答案会给你的。

标签: sql ruby-on-rails postgresql analytic-functions


【解决方案1】:

this sqlfiddle 中演示的一个选项是

select subq.*
  from (
    select rank() over (partition by seller_id order by updated_at desc) rnk,
           p.*
      from products p) subq
 order by rnk, updated_at desc;

【讨论】:

  • 上述查询确实生成了我指定的原始输出,但这似乎是由于我最初订购数据的方式。请查看我以相反顺序放置时间戳的更新。在这种情况下,此查询首先按 Seller_id 排序......但我正在寻找它首先按 updated_at 排序(即,真的希望首先是最新项目)。
  • @kburkhardt - 再次更新
猜你喜欢
  • 2020-03-14
  • 2021-10-02
  • 1970-01-01
  • 2011-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-09
相关资源
最近更新 更多