如何通过对其中的一列进行分组来基于两列对数据进行排序?

时间:2014-03-11 18:59:27

标签: sql sorting

我有以下数据集。 通过stmt_dte desc

从STATEMENT_HISTORY(nolock)顺序中选择*
stmt_key          stmt_dte                stmt_start_dte          stmt_end_dte
----------- ----------------------- ----------------------- -----------------------
12          2013-10-13 00:00:00.000 2013-07-10 00:00:00.000 2013-08-10 00:00:00.000
11          2013-10-12 00:00:00.000 2013-03-10 00:00:00.000 2013-04-10 00:00:00.000
10          2013-10-11 00:00:00.000 2013-07-10 00:00:00.000 2013-08-10 00:00:00.000                
9           2013-10-10 00:00:00.000 2013-09-10 00:00:00.000 2013-10-10 00:00:00.000
8           2013-09-10 00:00:00.000 2013-08-10 00:00:00.000 2013-09-10 00:00:00.000
7           2013-08-10 00:00:00.000 2013-07-10 00:00:00.000 2013-08-10 00:00:00.000
6           2013-07-10 00:00:00.000 2013-06-10 00:00:00.000 2013-07-10 00:00:00.000
5           2013-06-10 00:00:00.000 2013-05-10 00:00:00.000 2013-06-10 00:00:00.000
4           2013-05-10 00:00:00.000 2013-04-10 00:00:00.000 2013-05-10 00:00:00.000
3           2013-04-10 00:00:00.000 2013-03-10 00:00:00.000 2013-04-10 00:00:00.000
2           2013-03-10 00:00:00.000 2013-02-10 00:00:00.000 2013-03-10 00:00:00.000
1           2013-02-10 00:00:00.000 2013-01-10 00:00:00.000 2013-02-10 00:00:00.000

我的要求如下。 1.具有最新stmt_dte的行应该在顶部 2.与顶行的stmt_start_dte匹配的所有其他行应采用下一个按stmt_dte排序的行,依此类推。

预期输出应按以下顺序排列。

stmt_key
--------
12
10
7
11
3
10
9
8
6
5
4
2
1

我如何实现它?有人可以提出更好的方法吗?

1 个答案:

答案 0 :(得分:1)

您似乎在使用SQL Server。逻辑似乎是:

  • 将记录与stmt_start_dte保持在一起
  • 按最高stmt_dte
  • 排序

您可以使用max()窗口功能

来完成此操作
select stmt_key, stmt_dte, stmt_start_dte, stmt_end_dte
from (select sh.*, max(stmt_dte) over (partition by stmt_start_dte) as grp
      from STATEMENT_HISTORY sh
     ) sh
order by grp desc, stmt_dte desc;