請教SQL

gopark 2006-08-10 02:01:56
數據如下
NO C1 C2 Date
A X1 00 2006/01/01
A X1 01 2006/01/03
A X1 02 2006/01/04
A X2 02 2006/01/04
A X1 01 2006/01/07
A X1 00 2006/01/08
A X1 02 2006/01/09
A X1 00 2006/01/10
要求是抓出同一個C1編號在C2連續出現'00','01','02'的數據,00,01,02的出現先後次序無關,結果是
A X1 00 2006/01/01
A X1 01 2006/01/03
A X1 02 2006/01/04
A X1 01 2006/01/07
A X1 00 2006/01/08
A X1 02 2006/01/09
...全文
278 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
fcuandy 2006-08-10
  • 打赏
  • 举报
回复
2楼的朋友你可以加多几条其它的测试数据试一下
fcuandy 2006-08-10
  • 打赏
  • 举报
回复
楼上朋友的语句似乎有点问题.
只是结果数据恰好正确.

而楼主的逻辑,第5,6,7,8条记录C1相同,C2都是00,01,02之内,加上不论顺序,所以无法区别取哪条.当然,如果有条件限制:取前三条,或后三条,就可以确定.所以在不加条件的情况下,最后一条记录是取出来的.

Declare @tb table(No varchar(8),C1 varchar(8),C2 varchar(2),date varchar(20))
Insert Into @tb
Select 'A','X1','00','2006/01/01'
union all Select 'A','X1','01','2006/01/03'
union all Select 'A','X1','02','2006/01/04'
union all Select 'A','X2','02','2006/01/04'
union all Select 'A','X1','01','2006/01/07'
union all Select 'A','X1','00','2006/01/08'
union all Select 'A','X1','02','2006/01/09'
union all Select 'A','X1','00','2006/01/10'
select *,IDENTITY(int) ID INTO #t from @tb

SELECT a.*,NULLIF(a.c1,b.c1) g
INTO #t1
FROM #t a
LEFT JOIN #t b
ON a.id=b.id+1
SELECT a.*,GID=(
CASE ISNULL(a.g,'') WHEN '' THEN
(SELECT MAX(ID) FROM #t1 b WHERE a.C1=b.C1 AND b.ID<=a.ID AND b.g IS NOT NULL)
ELSE
a.id
END
)
INTO #base
FROM #t1 a

SELECT * FROM #base a
WHERE
CHARINDEX(C2,'00,01,02')>0
AND
NOT EXISTS
(
SELECT 1 FROM #base b WHERE a.GID=b.GID AND CHARINDEX(b.C2,'00,01,02')<1
)
AND NOT EXISTS
(
SELECT 1 FROM (SELECT '00' C2 UNION SELECT '01' UNION SELECT '02') z
WHERE z.C2 NOT IN(SELECT c2 FROM #base w WHERE w.Gid=a.Gid)
)

DROP TABLE #t
DROP TABLE #t1
DROP TABLE #base

/*结果.
A X1 00 2006/01/01 1 X1 1
A X1 01 2006/01/03 2 NULL 1
A X1 02 2006/01/04 3 NULL 1
A X1 01 2006/01/07 5 X1 5
A X1 00 2006/01/08 6 NULL 5
A X1 02 2006/01/09 7 NULL 5
A X1 00 2006/01/10 8 NULL 5
*/

语句还是有可以简化的地方,为了楼主可能提出只取三条的要求,所以先这样写了,方便扩展
WangZWang 2006-08-10
  • 打赏
  • 举报
回复
Declare @tb table(No varchar(8),C1 varchar(8),C2 varchar(2),date varchar(20))
Insert Into @tb
Select 'A','X1','00','2006/01/01'
union all Select 'A','X1','01','2006/01/03'
union all Select 'A','X1','02','2006/01/04'
union all Select 'A','X2','02','2006/01/04'
union all Select 'A','X1','01','2006/01/07'
union all Select 'A','X1','00','2006/01/08'
union all Select 'A','X1','02','2006/01/09'
union all Select 'A','X1','00','2006/01/10'
select * from @tb

Select * from @tb as a
where exists(Select * from(
Select C1,C2 from @tb
Union
Select C1,-1 from @tb) as b
where C1=a.C1 and C2=a.C2-1)
splory 2006-08-10
  • 打赏
  • 举报
回复
暂时还没有思路,帮你顶一下
内容概要:本文介绍了一种基于多目标粒子群算法(MOPSO)的微电网优化调度模型,综合考虑风能、光伏、储能系统、柴油发电机、燃气轮机以及与主电网之间的能量交互等多种分布式能源的协同运行。通过构建以运行成本最小化、碳排放最低化和系统可靠性最优化为目标的多目标优化模型,利用Matlab平台实现MOPSO算法求解,完成对微电网在不同运行场景下的能量管理与调度方案优化。该模型能够有效平衡经济性与环保性之间的关系,适用于含多类型分布式电源的复杂微电网系统,具有较强的工程应用价值和科研参考意义; 适合人群:具备一定电力系统基础知识和Matlab编程能力的研究生、科研人员及工程技术人员,尤其适合从事微电网、智能电网、综合能源系统、可再生能源集成与优化调度等领域研究的专业人士; 使用场景及目标:①用于多能源耦合微电网系统的协同优化调度研究;②支持多目标智能优化算法在能源系统中的建模与求解实践,帮助用户掌握MOPSO在实际工程问题中的应用方法;③为学术论文复现、毕业设计、科研项目开发提供完整的代码实例与技术支撑; 阅读建议:建议读者结合Matlab代码与理论文档,深入理解目标函数构建、约束条件处理及Pareto最优解集生成机制,重点关注算法参数设置、多目标权衡分析与结果可视化,并可通过调整能源配置或引入新约束进行二次开发与创新研究。

34,876

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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