Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 如何给子gorup排序_Sql Server 2008 - Fatal编程技术网

Sql server 2008 如何给子gorup排序

Sql server 2008 如何给子gorup排序,sql-server-2008,Sql Server 2008,我有一个如下表结构 id wstage wstatus wdate 101 Unaquired create 2013-08-29 17:07:20.040 101 Unaquired rework 2013-08-29 18:07:20.040 101 inprocess accqui 2013-08-29 19:07:20.040 101 inprocess alloca 2013-08-29 20:07:20.040 101 Unaquired cr

我有一个如下表结构

id  wstage      wstatus wdate
101 Unaquired   create  2013-08-29 17:07:20.040
101 Unaquired   rework  2013-08-29 18:07:20.040
101 inprocess   accqui  2013-08-29 19:07:20.040
101 inprocess   alloca  2013-08-29 20:07:20.040
101 Unaquired   create  2013-08-29 21:07:20.040
101 Unaquired   rework  2013-08-29 22:07:20.040
我得把这个数成这样

id  wstage      wstatus wdate                   rownumber
101 Unaquired   rework  2013-08-29 22:07:20.040 1
101 Unaquired   create  2013-08-29 21:07:20.040 1
101 inprocess   alloca  2013-08-29 20:07:20.040 2
101 inprocess   accqui  2013-08-29 19:07:20.040 2
101 Unaquired   rework  2013-08-29 18:07:20.040 3
101 Unaquired   create  2013-08-29 17:07:20.040 3
我正在尝试使用函数

select *,ROW_NUMBER() over (partition by id,wstage order by wdate desc) rownumber

但这并没有产生预期的产出。我不想使用pl/sql,是否有一个排名函数或简单的查询来实现这一点。我的表有5000万条记录。

假设每个
id
wdate
值是唯一的,这可能会完成以下任务:

WITH partitioned AS (
  SELECT
    *,
    grp = ROW_NUMBER() OVER (PARTITION BY id         ORDER BY wdate DESC)
        - ROW_NUMBER() OVER (PARTITION BY id, wstage ORDER BY wdate DESC)
  FROM atable
),
maxdates AS (
  SELECT
    id, wstage, wstatus, wdate,
    maxwdate = MAX(wdate) OVER (PARTITION BY id, wstage, grp)
  FROM partitioned
)
SELECT
  id, wstage, wstatus, wdate,
  rownumber = DENSE_RANK() OVER (PARTITION BY id ORDER BY maxwdate DESC)
FROM maxdates
;
第一个CTE确定不同的
id,wstage
孤岛,第二个CTE查找每个孤岛的最大
wdate
,主查询根据找到的最大值对行进行排序


此查询的SQL FIDLE演示。

在2012年,您可以使用
功能。在2008年,它必须是一个更复杂的查询。为了获得最佳效率,可能需要一个游标。结果集中没有逻辑。为什么最后两行有
rownumber=3
?@AndreyGordeev“rownumber”按“wdate”的降序排列。对于“wstage”中的更改,应激活行数。