自定义排序(分区?)两列并在一个查询中分页

时间:2015-07-13 14:13:25

标签: sql sql-server sql-server-2008

假设我们有以下数据:

+-----+------------+------------------+
| uid |  company   +   last_complaint |
+-----+------------+------------------+
|   1 |    Foo inc +       2015-01-01 |
|   2 |    Bar ltd +       2015-02-02 |
|   3 |    Baz inc +       2015-03-03 |
|   4 |    Bar ltd +       2015-04-04 |
|   5 |    Foo inc +       2015-05-05 |
+-----+------------+------------------+

我需要对记录进行排序,以便:

  • 最新记录先行;
  • 如果有来自同一公司的更多记录(不论日期),他们应该立即进行(也按其中最后一个投诉日期排序),然后是下一个最新记录,依此类推。

所以期望的结果如下:

+-----+------------+------------------+
| uid |  company   +   last_complaint |
+-----+------------+------------------+
|   5 |    Foo inc +       2015-05-05 |
|   1 |    Foo inc +       2015-01-01 |
|   4 |    Bar ltd +       2015-04-04 |
|   2 |    Bar ltd +       2015-02-02 |
|   3 |    Baz inc +       2015-03-03 |
+-----+------------+------------------+

除此之外,我可能需要显示此类订单的第二页(如果同一公司在页面之间进行分割,则可以。)

很明显,ORDER BY根本不够好,需要更好的工具。我查看了一些分区的查询,但是我不确定这个概念是否可以成功应用于这种情况。

提前致谢。

2 个答案:

答案 0 :(得分:1)

以下是一种使用窗口函数获取每家公司最近投诉日期的方法:

select d.*
from (select d.*,
             max(last_complaint) over (partition by company) as maxlc
      from data d
     ) d
order by maxlc desc, company, last_complaint desc;

答案 1 :(得分:1)

这应该可以解决问题,子查询首先根据上次投诉对公司列进行排序,然后根据该顺序从主表中返回数据:

ElementHost