求查询语句,多个条件:相同取唯一、再取最大等

jlpdgy004 2015-12-22 06:13:49
ID PlanID TrackProgress TrackDate Reson CDate CTime Cuser Mdate Mtime Muser
36 11 20 20151223 X 20151222 172723 admin 20151222 172723 admin
35 12 10 20151227 Y 20151222 140813 admin 20151222 140813 admin
34 12 10 20151222 Z 20151222 140603 admin 20151222 140603 admin

求一语句:
1. 根据PlanID 获得唯一
2. 如果PlanID 相同,比较TrackProgress,大的保留
如果TrackProgress 相同,再比较 TrackDate ,大的保留
如果TrackDate还相同,则比较 CDate ,大的保留
如果CDate还相同,比较CTime, 大的保留。
3. 如果都相同,根据ID保留大的。

以上表格查询结果应该是显示ID为35,36的2个数据
...全文
164 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
jlpdgy004 2015-12-23
  • 打赏
  • 举报
回复
szx1999 Tiger_Zhao 两位都是对的,都能满足我的需求。 谢谢2位。
Tiger_Zhao 2015-12-23
  • 打赏
  • 举报
回复
用 NOT EXISTS 判断就不需要管某一级相同的有几条了。
select *
from FZR_DH_TechPlanTrackPlan as d
where NOT EXISTS (SELECT *
FROM FZR_DH_TechPlanTrackPlan AS t
WHERE t.ID <> d.ID -- 先用这两个条件限定t记录不是d记录自己
AND t.PlanID = d.PlanID
AND ( -- 下面只要有一个满足条件,说明d记录不是最大的
(t.TrackProgress > d.TrackProgress)
OR (t.TrackProgress = d.TrackProgress AND
t.TrackDate > d.TrackDate)
OR (t.TrackProgress = d.TrackProgress AND
t.TrackDate = d.TrackDate AND
t.CDate > d.CDate)
OR (t.TrackProgress = d.TrackProgress AND
t.TrackDate = d.TrackDate AND
t.CDate = d.CDate AND
t.CTime > d.CTime)
OR (t.TrackProgress = d.TrackProgress AND
t.TrackDate = d.TrackDate AND
t.CDate = d.CDate AND
t.CTime > d.CTime AND
t.ID > d.ID)
)
)
等不到来世 2015-12-23
  • 打赏
  • 举报
回复

--第二个问题,要先显示转为字符串再连接。否则会优先按INT相加。
rtrim(a.PlanID)+rtrim(a.TrackProgress)+rtrim(a.TrackDate)+rtrim(a.CreateDate)+rtrim(a.CreateTime)
等不到来世 2015-12-23
  • 打赏
  • 举报
回复
select * from FZR_DH_TechPlanTrackPlan t
where ID=(select top 1 ID from FZR_DH_TechPlanTrackPlan where PlanID=t.PlanID 
order by TrackProgress desc,TrackDate desc,CDate desc,CTime desc,ID desc)
jlpdgy004 2015-12-23
  • 打赏
  • 举报
回复

select * from (
-- 选择计划跟踪数量为1的所有信息
select * from FZR_DH_TechPlanTrackPlan as d
where PlanID in ( select PlanID from (select PlanID, count(PlanID) rn from FZR_DH_TechPlanTrackPlan group by planid) as b
where b.rn = 1 )
union
-- 选择计划跟踪数量不为1的最大信息
select a.* from FZR_DH_TechPlanTrackPlan as a
left join (select PlanID , max(PlanID+TrackProgress+TrackDate+CreateDate+CreateTime) as rMax from FZR_DH_TechPlanTrackPlan
group by PlanID) as c on c.PlanID = a.PlanID
where a.PlanID in ( select PlanID from (select PlanID, count(PlanID) rn from FZR_DH_TechPlanTrackPlan group by planid) as b
                    where b.rn <> 1)
      and a.PlanID+a.TrackProgress+a.TrackDate+a.CreateDate+a.CreateTime = c.rMax
) as d
order by d.PlanID
比较粗鲁的方法 。 还能 有更好的写法不? 另外,全是数字,如何相加的时候当字符串处理? a.PlanID+a.TrackProgress+a.TrackDate+a.CreateDate+a.CreateTime 本意应该是12202015122320151223141212 现在加出来变成了40443284
jlpdgy004 2015-12-23
  • 打赏
  • 举报
回复
不好意思,我的是SQL 2000的, 服务器: 消息 156,级别 15,状态 1,行 1 在关键字 'with' 附近有语法错误。 服务器: 消息 195,级别 15,状态 1,行 1 'row_number' 不是可以识别的 函数名。
卖水果的net 版主 2015-12-22
  • 打赏
  • 举报
回复

-- 大概这个样子 

with m as (
select * ,
row_number() over(partition by PlanID order by TrackProgress desc ,TrackDate desc , CDate desc ,CTime desc ,id desc) rn 
from test 
)
select * from m where rn = 1 



34,590

社区成员

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

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