解决就给100分(排序问题,有点难度)

bzhi268 2010-02-04 11:17:46
如题:表T,有
列c1(姓名),列c2(时间),原数据如下:
D 2009-11-1 20:20:11
A 2009-12-1 20:20:11
A 2009-12-1 20:21:12
B 2009-12-1 20:23:01
A 2009-12-1 20:23:09
B 2009-12-1 20:25:44
B 2009-12-1 20:26:56
C 2009-12-1 20:29:11
D 2009-12-2 20:33:19
A 2009-12-4 20:33:19


先按最前时间把D排序出来,然后把D的记录紧跟排在一起;再排比D最前时间下一个时间的A,再把A的记录紧跟排在一起;如此类推,排序下去……的结果如下:
D 2009-11-1 20:20:11
D 2009-12-2 20:33:19
A 2009-12-1 20:20:11
A 2009-12-1 20:21:12
A 2009-12-1 20:33:19
A 2009-12-4 20:23:09
B 2009-12-1 20:23:01
B 2009-12-1 20:25:44
B 2009-12-1 20:26:56
C 2009-12-1 20:29:11
...全文
162 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
cs88dn 2010-02-06
  • 打赏
  • 举报
回复
学习了,不错!
ACMAIN_CHM 2010-02-06
  • 打赏
  • 举报
回复
select a.列c1,a.列c2,max(b.列c2)
from 表T a, 表T b
where a.列c1=b.列c1
group by a.列c1,a.列c2
group by 3 desc,2 desc
东那个升 2010-02-06
  • 打赏
  • 举报
回复

if object_id('[Tb]') is not null drop table [Tb]
go
create table [Tb]([c1] varchar(1),[c2] datetime)
insert [Tb]
select 'D','2009-11-1 20:20:11' union all
select 'A','2009-12-1 20:20:11' union all
select 'A','2009-12-1 20:21:12' union all
select 'B','2009-12-1 20:23:01' union all
select 'A','2009-12-1 20:23:09' union all
select 'B','2009-12-1 20:25:44' union all
select 'B','2009-12-1 20:26:56' union all
select 'C','2009-12-1 20:29:11' union all
select 'D','2009-12-2 20:33:19' union all
select 'A','2009-12-4 20:33:19'



select *,identity(int,1,1) as rn into #tt from Tb

select a.c1,a.c2 from #tt a ,(
select c1,MIN(rn) as rn from #tt
group by c1) b
where a.c1=b.c1

order by b.rn ,a.rn

bzhi268 2010-02-06
  • 打赏
  • 举报
回复
问题补充:
上面的数据只是表中的部分数据,实际数据有几万条
丰云 2010-02-04
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 foren_whb 的回复:]
简单的多条件排序而已,如下就可以了:
select c1,c2 from
order by c2,c1
[/Quote]
写漏了。。。
select c1,c2 from T
order by c2,c1
bancxc 2010-02-04
  • 打赏
  • 举报
回复
create table tb(c1 varchar(10),c2 datetime)
insert into tb select
'D','2009-11-1 20:20:11' union all select
'A','2009-12-1 20:20:11' union all select
'A','2009-12-1 20:21:12' union all select
'B','2009-12-1 20:23:01' union all select
'A','2009-12-1 20:23:09' union all select
'B','2009-12-1 20:25:44' union all select
'B','2009-12-1 20:26:56' union all select
'C','2009-12-1 20:29:11' union all select
'D','2009-12-2 20:33:19' union all select
'A','2009-12-4 20:33:19'


select * from tb
order by case c1 when 'D' then 0 else 1 end asc ,c1

c1 c2
---------- -----------------------
D 2009-11-01 20:20:11.000
D 2009-12-02 20:33:19.000
A 2009-12-04 20:33:19.000
A 2009-12-01 20:20:11.000
A 2009-12-01 20:21:12.000
A 2009-12-01 20:23:09.000
B 2009-12-01 20:25:44.000
B 2009-12-01 20:26:56.000
B 2009-12-01 20:23:01.000
C 2009-12-01 20:29:11.000

(10 行受影响)
--这个绝对没问题
丰云 2010-02-04
  • 打赏
  • 举报
回复

简单的多条件排序而已,如下就可以了:
select c1,c2 from
order by c2,c1
快乐_石头 2010-02-04
  • 打赏
  • 举报
回复
用charindex有點牽強
黄_瓜 2010-02-04
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 chuifengde 的回复:]
SQL codeDECLARE@atable(c1varchar(20),bSMALLDATETIME)INSERT@aSELECT'D' ,'2009-11-1 20:20:11'unionallselect'A' ,'2009-12-1 20:20:11'unionallselect'A' ,'2009-12-1 20:21:12'unionallselect'B' ,?-
[/Quote]
学习
bancxc 2010-02-04
  • 打赏
  • 举报
回复
create table tb(c1 varchar(10),c2 datetime)
insert into tb select
'D','2009-11-1 20:20:11' union all select
'A','2009-12-1 20:20:11' union all select
'A','2009-12-1 20:21:12' union all select
'B','2009-12-1 20:23:01' union all select
'A','2009-12-1 20:23:09' union all select
'B','2009-12-1 20:25:44' union all select
'B','2009-12-1 20:26:56' union all select
'C','2009-12-1 20:29:11' union all select
'D','2009-12-2 20:33:19' union all select
'A','2009-12-4 20:33:19'


select * from tb
order by case c1 when 'D' then '' else c1 end

c1 c2
---------- -----------------------
D 2009-11-01 20:20:11.000
D 2009-12-02 20:33:19.000
A 2009-12-04 20:33:19.000
A 2009-12-01 20:20:11.000
A 2009-12-01 20:21:12.000
A 2009-12-01 20:23:09.000
B 2009-12-01 20:25:44.000
B 2009-12-01 20:26:56.000
B 2009-12-01 20:23:01.000
C 2009-12-01 20:29:11.000

(10 行受影响)
chuifengde 2010-02-04
  • 打赏
  • 举报
回复
上面的改一点:
SELECT * FROM @a a
ORDER BY (SELECT min(b) FROM @a WHERE c1=a.c1),b
--小F-- 2010-02-04
  • 打赏
  • 举报
回复
----------------------------------------------------------------
-- Author :fredrickhu(我是小F,向高手学习)
-- Date :2010-02-04 11:19:26
-- Version:
-- Microsoft SQL Server 2005 - 9.00.4035.00 (Intel X86)
-- Nov 24 2008 13:01:59
-- Copyright (c) 1988-2005 Microsoft Corporation
-- Developer Edition on Windows NT 5.2 (Build 3790: Service Pack 1)
--
----------------------------------------------------------------
--> 测试数据:[tb]
if object_id('[tb]') is not null drop table [tb]
go
create table [tb]([c1] varchar(1),[c2] datetime)
insert [tb]
select 'D','2009-11-1 20:20:11' union all
select 'A','2009-12-1 20:20:11' union all
select 'A','2009-12-1 20:21:12' union all
select 'B','2009-12-1 20:23:01' union all
select 'A','2009-12-1 20:23:09' union all
select 'B','2009-12-1 20:25:44' union all
select 'B','2009-12-1 20:26:56' union all
select 'C','2009-12-1 20:29:11' union all
select 'D','2009-12-2 20:33:19' union all
select 'A','2009-12-4 20:33:19'
--------------开始查询--------------------------
--select id=row_number()over(partition by c1 order by c2),* from tb
select
c1,c2
from
(select id=row_number()over(partition by c1 order by c2),* from tb)t
order by
charindex(','+c1+',',',d,a,b,c,'),c2
----------------结果----------------------------
/* ---- -----------------------
D 2009-11-01 20:20:11.000
D 2009-12-02 20:33:19.000
A 2009-12-01 20:20:11.000
A 2009-12-01 20:21:12.000
A 2009-12-01 20:23:09.000
A 2009-12-04 20:33:19.000
B 2009-12-01 20:23:01.000
B 2009-12-01 20:25:44.000
B 2009-12-01 20:26:56.000
C 2009-12-01 20:29:11.000

(10 行受影响)
*/
快乐_石头 2010-02-04
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 josy 的回复:]
SQL code---测试数据---ifobject_id('[T]')isnotnulldroptable[T]gocreatetable[T]([c1]varchar(1),[c2]datetime)insert[T]select'D','2009-11-1 20:20:11'unionallselect'A','2009-12-1 20:20:11'unionallselect'A','20?-
[/Quote]
頂~~
steptodream 2010-02-04
  • 打赏
  • 举报
回复
chuifengde 2010-02-04
  • 打赏
  • 举报
回复
DECLARE @a table(c1 varchar(20),b SMALLDATETIME)
INSERT @a SELECT 'D' ,'2009-11-1 20:20:11'
union all select 'A' ,'2009-12-1 20:20:11'
union all select 'A' ,'2009-12-1 20:21:12'
union all select 'B' ,'2009-12-1 20:23:01'
union all select 'A' ,'2009-12-1 20:23:09'
union all select 'B' ,'2009-12-1 20:25:44'
union all select 'B' ,'2009-12-1 20:26:56'
union all select 'C' ,'2009-12-1 20:29:11'
union all select 'D' ,'2009-12-2 20:33:19'
union all select 'A' ,'2009-12-4 20:33:19'



SELECT * FROM @a a
ORDER BY (SELECT min(b) FROM @a WHERE c1=a.c1)

--result
/*
c1 b
-------------------- ------------------------------------------------------
D 2009-11-01 20:20:00
D 2009-12-02 20:33:00
A 2009-12-04 20:33:00
A 2009-12-01 20:20:00
A 2009-12-01 20:21:00
A 2009-12-01 20:23:00
B 2009-12-01 20:26:00
B 2009-12-01 20:27:00
B 2009-12-01 20:23:00
C 2009-12-01 20:29:00

(所影响的行数为 10 行)
*/
黄_瓜 2010-02-04
  • 打赏
  • 举报
回复
select * from [tb]
order by charindex(','+[c1]+',',',D,A,B,C,'),[c2]
百年树人 2010-02-04
  • 打赏
  • 举报
回复
---测试数据---
if object_id('[T]') is not null drop table [T]
go
create table [T]([c1] varchar(1),[c2] datetime)
insert [T]
select 'D','2009-11-1 20:20:11' union all
select 'A','2009-12-1 20:20:11' union all
select 'A','2009-12-1 20:21:12' union all
select 'B','2009-12-1 20:23:01' union all
select 'A','2009-12-1 20:23:09' union all
select 'B','2009-12-1 20:25:44' union all
select 'B','2009-12-1 20:26:56' union all
select 'C','2009-12-1 20:29:11' union all
select 'D','2009-12-2 20:33:19' union all
select 'A','2009-12-4 20:33:19'

---查询---
select a.*
from t a,
(select c1,min(c2)c2 from t group by c1) b
where a.c1=b.c1
order by b.c2,a.c1,a.c2

---结果---
c1 c2
---- ------------------------------------------------------
D 2009-11-01 20:20:11.000
D 2009-12-02 20:33:19.000
A 2009-12-01 20:20:11.000
A 2009-12-01 20:21:12.000
A 2009-12-01 20:23:09.000
A 2009-12-04 20:33:19.000
B 2009-12-01 20:23:01.000
B 2009-12-01 20:25:44.000
B 2009-12-01 20:26:56.000
C 2009-12-01 20:29:11.000

(所影响的行数为 10 行)
--小F-- 2010-02-04
  • 打赏
  • 举报
回复
----------------------------------------------------------------
-- Author :fredrickhu(我是小F,向高手学习)
-- Date :2010-02-04 11:19:26
-- Version:
-- Microsoft SQL Server 2005 - 9.00.4035.00 (Intel X86)
-- Nov 24 2008 13:01:59
-- Copyright (c) 1988-2005 Microsoft Corporation
-- Developer Edition on Windows NT 5.2 (Build 3790: Service Pack 1)
--
----------------------------------------------------------------
--> 测试数据:[tb]
if object_id('[tb]') is not null drop table [tb]
go
create table [tb]([c1] varchar(1),[c2] datetime)
insert [tb]
select 'D','2009-11-1 20:20:11' union all
select 'A','2009-12-1 20:20:11' union all
select 'A','2009-12-1 20:21:12' union all
select 'B','2009-12-1 20:23:01' union all
select 'A','2009-12-1 20:23:09' union all
select 'B','2009-12-1 20:25:44' union all
select 'B','2009-12-1 20:26:56' union all
select 'C','2009-12-1 20:29:11' union all
select 'D','2009-12-2 20:33:19' union all
select 'A','2009-12-4 20:33:19'
--------------开始查询--------------------------
--select id=row_number()over(partition by c1 order by c2),* from tb
select
c1,c2
from
(select id=row_number()over(partition by c1 order by c2),* from tb)t
order by
case c1 when 'd' then 1 else 2 end
----------------结果----------------------------
/* c1 c2
---- -----------------------
D 2009-11-01 20:20:11.000
D 2009-12-02 20:33:19.000
A 2009-12-04 20:33:19.000
A 2009-12-01 20:20:11.000
A 2009-12-01 20:21:12.000
B 2009-12-01 20:23:01.000
A 2009-12-01 20:23:09.000
B 2009-12-01 20:25:44.000
B 2009-12-01 20:26:56.000
C 2009-12-01 20:29:11.000

(10 行受影响)
*/
nianran520 2010-02-04
  • 打赏
  • 举报
回复
if object_id('[tb]') is not null drop table [tb]
go
create table [tb]([c1] varchar(1),[c2] datetime)
insert [tb]
select 'D','2009-11-1 20:20:11' union all
select 'A','2009-12-1 20:20:11' union all
select 'A','2009-12-1 20:21:12' union all
select 'B','2009-12-1 20:23:01' union all
select 'A','2009-12-1 20:23:09' union all
select 'B','2009-12-1 20:25:44' union all
select 'B','2009-12-1 20:26:56' union all
select 'C','2009-12-1 20:29:11' union all
select 'D','2009-12-2 20:33:19' union all
select 'A','2009-12-4 20:33:19'

select * from [tb]
order by charindex(','+[c1]+',',',D,A,B,C,'),
[c2]
--------------------------------
D 2009-11-01 20:20:11.000
D 2009-12-02 20:33:19.000
A 2009-12-01 20:20:11.000
A 2009-12-01 20:21:12.000
A 2009-12-01 20:23:09.000
A 2009-12-04 20:33:19.000
B 2009-12-01 20:23:01.000
B 2009-12-01 20:25:44.000
B 2009-12-01 20:26:56.000
C 2009-12-01 20:29:11.000

内容概要:本文围绕可变桨叶四旋翼无人机的规范控制与点对点运动模拟展开,重点研究优化推力配策略在翻转动作中的应用与性能比较。通过Matlab代码实现,构建了四旋翼动力学模型,并设计了多种控制算法以实现精确的姿态调整与轨迹跟踪。研究对比了不同推力配方案在执行高机动性翻转动作时的稳定性、能耗效率与响应速度,旨在提升无人机在复杂飞行任务中的动态性能与控制精度。该仿真研究为无人机飞控系统的设计与优化提供了理论依据和技术支持。; 适合人群:具备一定自动控制理论基础和Matlab编程能力,从事无人机控制、飞行器动力学或机器人系统研究的科研人员及研究生。; 使用场景及目标:① 实现四旋翼无人机在三维空间中的精确点对点运动控制;② 对比析不同推力配策略在执行翻转等高难度动作时的控制效果与能耗表现,优化飞行性能;③ 为无人机自主飞行、特技飞行及复杂环境下的机动控制提供算法验证平台。; 阅读建议:此资源以Matlab仿真为核心,建议读者结合相关控制理论知识,深入理解代码实现细节,重点关注动力学建模、控制律设计与推力配模块。在学习过程中,应动手调试参数,复现文中翻转动作的仿真结果,并尝试拓展至其他复杂飞行任务,以加深对无人机控制机理的理解。

22,297

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧