sqlserver 用CTE 递归 排序问题 求大神指教啊

问题描述

sqlserver 用CTE 递归 排序问题 求大神指教啊

create table t_manage
(f_gener int,f_accounts varchar(100) null,
f_firstGener varchar(100) null,
f_secondGener varchar(100) null,
f_thirdGener varchar(100) null,
f_joindate datetime null
)
select * from dbo.t_manage
insert into dbo.t_manage values('1','BV51','F51','D51',null,'2013-11-08 12:02:29.477')
insert into dbo.t_manage values('1','CY51','F51','D51',null,'2014-05-03 13:48:05.240')
insert into dbo.t_manage values('1','CY52','F51','D51',null,'2014-07-08 11:44:37.927')
insert into dbo.t_manage values('1','BV58','F51','D51',null,'2014-09-25 14:26:16.397')
insert into dbo.t_manage values('1','BV519','F51','D51',null,'2014-09-28 11:54:05.190')
insert into dbo.t_manage values('1','BV520','F51','D51',null,'2014-09-28 12:01:40.753')
insert into dbo.t_manage values('1','D518','F51','D51',null,'2014-09-28 12:04:37.537')
insert into dbo.t_manage values('1','CY518','F51','D51',null,'2014-09-28 15:22:20.727')
insert into dbo.t_manage values('1','BU5103','F51','D51',null,'2014-09-28 16:52:37.243')

insert into dbo.t_manage values('2','BU5101','CY51','F51','D51','2013-11-08 12:02:29.477')
insert into dbo.t_manage values('2','BU591','CY51','F51','D51','2014-05-03 13:48:05.240')
insert into dbo.t_manage values('2','CY58','CY52','F51','D51','2014-07-08 11:44:37.927')
insert into dbo.t_manage values('2','BV57','CY52','F51','D51','2014-09-25 14:26:16.397')
insert into dbo.t_manage values('2','BV59','BV58','F51','D51','2014-09-28 11:54:05.190')
insert into dbo.t_manage values('2','BV510','CY52','F51','D51','2014-09-28 12:01:40.753')
insert into dbo.t_manage values('2','CY59','CY52','F51','D51','2014-09-28 12:04:37.537')
insert into dbo.t_manage values('2','D512','CY52','F51','D51','2014-09-28 15:22:20.727')
insert into dbo.t_manage values('2','F510','CY52','F51','D51','2014-09-28 16:52:37.243')
insert into dbo.t_manage values('2','CY510','CY52','F51','D51','2014-09-25 14:26:16.397')
insert into dbo.t_manage values('2','D513','CY52','F51','D51','2014-09-28 11:54:05.190')
insert into dbo.t_manage values('2','BV512','BV51','F51','D51','2014-09-28 12:01:40.753')
insert into dbo.t_manage values('2','F511','CY52','F51','D51','2014-09-28 12:04:37.537')
insert into dbo.t_manage values('2','BV521','BV51','F51','D51','2014-09-28 15:22:20.727')
insert into dbo.t_manage values('2','CY515','BV51','F51','D51','2014-09-28 16:52:37.243')

insert into dbo.t_manage values('3','D511','BV59','CY52','F51','2014-09-25 14:55:08.010')
insert into dbo.t_manage values('3','Z58','CY58','CY52','F51','2014-09-25 15:33:19.227')
insert into dbo.t_manage values('3','BU597','BV510','CY52','F51','2014-09-25 17:49:45.923')
insert into dbo.t_manage values('3','BV511','F510','CY52','F51','2014-09-26 14:28:34.310')
insert into dbo.t_manage values('3','Z510','BV510','CY52','F51','2014-09-27 11:47:40.927')

这是一张表 以及表中内容 f_gener=1表示第一代 f_gener=2表示第二代 f_gener=3表示第三代 f_joindate表示加入日期 现在要求:以第一代为主排序,再以第二代细分第三代,第一代排序越晚加入帐号排在越前面,第二代,第三代再按照先后顺序排序

排序需求:
以第一代帐号排序 越晚加入帐号排在越前面,第二代和第三代再按照加入先后顺序依序排列。
现在写的sql可以做到各代层级正确,第一代帐号也能满足越晚加入越前面。但是第二代和第三代就没办法做到了 求指教啊
WITH personreleation AS (
select * from (
SELECT row_number() over(order by f_joindate desc) xh,a.f_accounts,a.f_firstGener,a.f_secondGener,a.f_thirdGener,a.f_joindate,
cast(f_firstGener+''+ f_accounts AS VARCHAR(200)) AS Full_Code,cast(1 as int) as f_gener
FROM t_manage a with(nolock) WHERE f_firstGener = 'F51') as m

UNION all
SELECT c.xh,b.f_accounts,b.f_firstGener,b.f_secondGener,b.f_thirdGener,b.f_joindate,
cast(c.Full_Code +''+ b.f_accounts AS VARCHAR(200)) AS Full_Code,cast(c.f_gener+1 as int) as f_gener
FROM t_manage AS b with(nolock)
INNER join personreleation AS c ON b.f_firstGener= c.f_accounts
)
,results as (
SELECT ROW_NUMBER() OVER(ORDER BY xh,Full_Code,f_joindate desc) rownumber,

  • FROM personreleation with(nolock)
    where 1=1 )
    select * from results where rownumber BETWEEN 1 AND 50

解决方案

 ;WITH personreleation AS (
    select * from (
        SELECT row_number() over(order by f_joindate desc) xh,a.f_accounts,a.f_firstGener,a.f_secondGener,a.f_thirdGener,a.f_joindate,
        cast(f_firstGener+''+ f_accounts AS VARCHAR(200)) AS Full_Code,cast(1 as int) as f_gener
        FROM t_manage a with(nolock) WHERE f_firstGener = 'F51') as m
    UNION all
    SELECT c.xh,b.f_accounts,b.f_firstGener,b.f_secondGener,b.f_thirdGener,b.f_joindate,
        cast(c.Full_Code +''+ b.f_accounts AS VARCHAR(200)) AS Full_Code,cast(c.f_gener+1 as int) as f_gener
    FROM t_manage AS b with(nolock)
        INNER join personreleation AS c ON b.f_firstGener= c.f_accounts
)
,
results as (
    SELECT ROW_NUMBER() OVER( PARTITION BY f_gener ORDER BY xh,Full_Code,f_joindate desc) rownumber, * FROM personreleation with(nolock) where 1=1
)
select * from results where rownumber BETWEEN 1 AND 50

加了: PARTITION BY f_gener

看下是不是你要的吧

时间: 2025-01-26 05:52:56

sqlserver 用CTE 递归 排序问题 求大神指教啊的相关文章

c++-两个排序问题求大神指教!!

问题描述 两个排序问题求大神指教!! 1.Problem 在英文中,若某些单词由相同的字母组成,且字母的个数均相等,那么这些单词互为Anagram.例如note. tone是一组Anagrams,top.opt.pot也是一组Anagrams. 现在给出一个字典,要求输出字典中没有Anagram的单词,输出时,按单词的字典序从小到大输出.注意,判断是否为Anagram时,请忽略单词间的大小写,例如,noTE.tOnE被视作时一组Anagrams. Input 输入数据有若干行,每行有若干单词,每

c# 4 0-c#求大神指教,关于递归排产线产品生产量的问题

问题描述 c#求大神指教,关于递归排产线产品生产量的问题 已知生产数量A,每日最大生产值B,客户需要产品到货时间 向数据库添加数据时候需要主意以下几点 1.生产完成时间尽量往后(既是距离到货时间前两天即可) 2.日最大产量不能大于每日最大生产值(200) 3.生产日期从当前时间开始往后排 4.日最大生产量必须要满足(既是每天必须生产200) eg:需要生产500个产品,日最大产值200,客户需要2014-12-20收到产品(客需要到货时间可以协调) 1.生产完成日:2014-12-17 开始生产

android-Android通过jtds连接sql,加载驱动程序出错,求大神指教

问题描述 Android通过jtds连接sql,加载驱动程序出错,求大神指教 import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import android.app.Activity; import android.database.SQLException; import android.os.Bundle; impor

我是个学生,求大神指教!!!

问题描述 我是个学生,求大神指教!!! 题目是:有n个整数,使前面各数顺序向后移m个位置,最后m个数变成最前面m个数,写一个函数实现以上功能#includeint input(int *p){ int i=0; do { scanf(""%d""p+i); i++; }while(*(p+i-1)!=-1);return i-1; }int* mv(int nint mint p){ int ib[100]*c=NULL; for(i=0;i<m;i++) {

css 样式 求教-求大神指教css样式前后对齐不上

问题描述 求大神指教css样式前后对齐不上 求大神,苦恼一上午了.增加了一个样式通知管理.老前后对其不上, </tr> 可惜c币不够.真心求教 Blockquote 解决方案 </tr>代码送上 解决方案二: 代码能看见吗 </tr> 解决方案三: 看不到代码..把左尖括号去掉后再发来看看 解决方案四: 我的建议是不要用标签属性来定义高宽等,容易受到干扰,改为样式试试 解决方案五: 只能看到一堆 红叉....... 解决方案六: 老兄,你的图--挂了-- 解决方案七:

图片-Eclipse编译Java文件出现空指针错误,求大神指教如何改正

问题描述 Eclipse编译Java文件出现空指针错误,求大神指教如何改正 另外出现错误的代码 主函数 public static void main(String[] args) { Login login = new Login(RELOAD); login.setVisible(true); } public Login() { super(); initialize(); } public Login(boolean reload) { super(); initialize(); ne

关于php实例化问题 求大神指教

问题描述 关于php实例化问题 求大神指教 我在入口文件里 写了这么一句实例化 $a = new applicationcontrollera();这是目录结构 其中入口文件 和 application都是在根目录下 为什么它说这个applicationcontrollera找不到 求解决 解决方案 你在入口文件require a.php 再new一个

c语言-C语言小白问题求大神指教

问题描述 C语言小白问题求大神指教 #include #include unsigned fun(int w) { int a; int i; i=1; a=w; while(a==0) { a=a/10; i++; } w=w%pow(10,i); return w; } unsigned main() { int w; printf("please enter a number:n"); scanf("%d",&w); printf("the

求指导-微信企业号如何发送消息,求大神指教

问题描述 微信企业号如何发送消息,求大神指教 微信企业号如何发送消息,研究了好几天了,还是发送不了信息,求大神指导,最好能提供源码,拜托了, 解决方案 http://mobile.51cto.com/app-show-452153.htmhttp://www.csdn.net/article/a/2014-10-13/15820372 解决方案二: 我搜了两个微信工作平台接口实现的Java版的源码,都是要积分的.这个我看源码了,基本接口功能都有.就是要10个积分.我下载了,如果需要的话,我可以发