mySql 中是否可以实现oracle中的PARTITION BY分区优先取值功能

枫中叶 2016-07-19 08:00:05


现在有个问题,一个优先取值的问题,在图中有标注,如果出现两条记录,优先取第一列中标红不为空的值,实现像oracle中的 PARTITION BY一样 (ORDER BY DC.CONTRACT_START_DATE DESC NULLS LAST )以某个字段排序,然后取这个值的最大一条记录,不知道在Mysql中是否能实现
...全文
759 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
瓜北一个 2017-10-11
  • 打赏
  • 举报
回复
你排序是要针对分组的字段排序才有规则,oracle 的分组排序row_number 也是这个规则,如果你自己写的话还是和mysql的语法是一样的
枫中叶 2016-07-20
  • 打赏
  • 举报
回复
引用 7 楼 zjcxc 的回复:
你自己根据实际情况应用方法,如果你应用不了 那么把表结构和数据文本贴出来,直接根据你的表结构和数据写,你直接搬过去 不是没理解你的意思,是你不会根据自己的情况去灵活变化
刚开始使用mysql 对这工具及语法不太熟悉,之前一直用oracle ,可能习惯了oracle中带来的那些便利的各种函数
zjcxc 2016-07-20
  • 打赏
  • 举报
回复
你自己根据实际情况应用方法,如果你应用不了 那么把表结构和数据文本贴出来,直接根据你的表结构和数据写,你直接搬过去 不是没理解你的意思,是你不会根据自己的情况去灵活变化
枫中叶 2016-07-20
  • 打赏
  • 举报
回复
引用 5 楼 zjcxc 的回复:
create table t(id int auto_increment primary key, name varchar(10), v int);
INSERT t(name,v) values
('a', 1),
('a', null),
('a', 2),
('b', 3),
('b', 1),
('b', null);

-- 每个 name v值最大的那条记录
select * from t a
where id=(select id from t b where a.name=b.name order by b.v desc limit 1);

drop table t;
不知道是我描述的不够清晰,还是你们理解的有误,现在的场景是:机型这个字段, 在a表中是有值的,在与b表关联后,会有三种场景 (1 是只有一条记录有值),(二是只有一条记录没有值),(三是会出现两条记录,一条是有值的,一条是没值),就是我截图中标红的地方,前面两种场景只会出现一条记录,可以忽略,第三种场景时有两条记录,就是有一条有值,有一条没值,那这个时候,我就得要优先去有值的这条记录,过滤掉没值的这条记录,只取一条,然后插入到接口表中。 不知道这样说,大家能否理解了。
zjcxc 2016-07-20
  • 打赏
  • 举报
回复
create table t(id int auto_increment primary key, name varchar(10), v int);
INSERT t(name,v) values
('a', 1),
('a', null),
('a', 2),
('b', 3),
('b', 1),
('b', null);

-- 每个 name v值最大的那条记录
select * from t a
where id=(select id from t b where a.name=b.name order by b.v desc limit 1);

drop table t;
枫中叶 2016-07-20
  • 打赏
  • 举报
回复
引用 2 楼 zjcxc 的回复:
null 值升序(ASC)在最前,降序(DESC)在最后,这个是默认规则,所以降序本来就符合你的要求,不需要特别处理的 select * from( select 1 union all select null union all select 3) x order by 1 desc;
没看懂你说的,我现在这样查询出来是两条,我想要的结果是优先取第一条不为空的那条记录,不要两条都取出来
枫中叶 2016-07-20
  • 打赏
  • 举报
回复
引用 1 楼 ACMAIN_CHM 的回复:
参考下贴中的多种方法 http://blog.csdn.net/acmain_chm/article/details/4126306 [征集]分组取最大N条记录方法征集,及散分....
这个过滤 不掉我想要的,我要取这图中不为空的那一条
zjcxc 2016-07-20
  • 打赏
  • 举报
回复
null 值升序(ASC)在最前,降序(DESC)在最后,这个是默认规则,所以降序本来就符合你的要求,不需要特别处理的 select * from( select 1 union all select null union all select 3) x order by 1 desc;
枫中叶 2016-07-20
  • 打赏
  • 举报
回复
引用 10 楼 wangjian0228 的回复:
[quote=引用 9 楼 wangjian0228 的回复:] #6是对的,就是利用order by 进行倒序排序,将空值置底,然后limit 1取最上一条,如果业务复杂可以把表结构和逻辑贴出来
5#。。。[/quote] 嗯 谢谢!
致命的西瓜 2016-07-20
  • 打赏
  • 举报
回复
引用 11 楼 tanghuahui1997 的回复:
[quote=引用 5 楼 zjcxc 的回复:]
create table t(id int auto_increment primary key, name varchar(10), v int);
INSERT t(name,v) values
('a', 1),
('a', null),
('a', 2),
('b', 3),
('b', 1),
('b', null);

-- 每个 name v值最大的那条记录
select * from t a
where id=(select id from t b where a.name=b.name order by b.v desc limit 1);

drop table t;
SELECT BC.CAPACITY_NAME,#运力名称 BC.FLIGHT_TYPE,#航班类型 BC.MILEAGE,#航班里程 BC.CAPACITY_TYPE,#运力类型 BC.IS_STOP,#经停标志 BC.PLANE_TYPE,#机型 #BC.PLANE_TYPE1,#机型 BC.SCHEDULE_FLIGHT_TYPE,#时效性航班类型 1为早航班 2为午航班 3为晚航班 BC.PLAN_SCHEDULED_DAYS,#班期 BC.MAX_LOAD,#机型业载 BC.DEPART_CITY_CODE,#始发城市 BC.DEPART_THR_LETTER_CODE,#始发地机场三字码 BC.ARRIVE_CITY_CODE,#目的地城市 BC.ARRIVE_THR_LETTER_CODE,#目的地机场三字码 BC.PLAN_DEPART_TM,#计划发出时间 BC.PLAN_ARRIVE_TM,#计划到达时间 BC.EFFECTIVE_DT,#航班生效日期 BC.EXPIRY_DT,#航班失效日期 BC.SEND_BELONG_NETWORK_CODE,#发货归属网点 BC.GET_BELONG_NETWORK_CODE,#提货归属网点 BC.FLY_OVER_DAYS,#飞行跨越天数 BC.CARGO_TERMINAL_LOAD,#货站截载时长 BC.LOAD_TIME_OF_CARGO_TERMINAL,#货站最晚截载时间 BC.PLATE_INFO,#打板信息 BC.BOARD_MAX_LOAD,#分板业载 BC.PROTOCOL_WEIGHT,#协议量 BC.AVAIABLE_CABIN_SPACE#可获取舱位 #BC.FALG FROM (SELECT CA.CAPACITY_NAME,#运力名称 CA.FLIGHT_TYPE,#航班类型 CA.MILEAGE,#航班里程 CA.CAPACITY_TYPE,#运力类型 CA.IS_STOP,#经停标志 CA.PLANE_TYPE,#机型 #AC.PLANE_TYPE AS PLANE_TYPE1,#机型 CA.SCHEDULE_FLIGHT_TYPE,#时效性航班类型 1为早航班 2为午航班 3为晚航班 FUNCTION_FORMAT_SCHEDULED_DAYS(CA.APPLICABLE_SCHEDULED_DAYS,AC.SCHEDULED_DAYS)AS PLAN_SCHEDULED_DAYS,#班期 CA.MAX_LOAD,#机型业载 CA.DEPART_CITY_CODE,#始发城市 CA.DEPART_THR_LETTER_CODE,#始发地机场三字码 CA.ARRIVE_CITY_CODE,#目的地城市 CA.ARRIVE_THR_LETTER_CODE,#目的地机场三字码 CA.APPLICABLE_SCHEDULED_DAYS,#班期 CA.PLAN_DEPART_TM,#计划发出时间 CA.PLAN_ARRIVE_TM,#计划到达时间 CA.EFFECTIVE_DT,#航班生效日期 CA.EXPIRY_DT,#航班失效日期 CA.SEND_BELONG_NETWORK_CODE,#发货归属网点 CA.GET_BELONG_NETWORK_CODE,#提货归属网点 CA.FLY_OVER_DAYS,#飞行跨越天数 CA.CARGO_TERMINAL_LOAD,#货站截载时长 CA.LOAD_TIME_OF_CARGO_TERMINAL,#货站最晚截载时间 CA.PLATE_INFO,#打板信息 CA.BOARD_MAX_LOAD,#分板业载 AC.PROTOCOL_WEIGHT,#协议量 AC.AVAIABLE_CABIN_SPACE,#可获取舱位 IF(AC.PLANE_TYPE IS NOT NULL,1,0) FALG FROM TM_AIR_USED_DAILY_CAPACITY CA LEFT JOIN (SELECT * FROM TT_AIR_AVAIABLE_CABIN T WHERE T.EXPIRATION_DATE >= NOW() AND T.IS_USED = 1) AC ON (CA.SEND_BELONG_NETWORK_CODE = AC.SEND_BELONG_NETWORK_CODE AND CA.DEPART_CITY_CODE = AC.DEPART_CITY_CODE AND CA.ARRIVE_CITY_CODE = AC.ARRIVE_CITY_CODE AND CA.CAPACITY_NAME = AC.CAPACITY_NAME AND CA.PLANE_TYPE = IFNULL(AC.PLANE_TYPE,CA.PLANE_TYPE) AND FUNCTION_FORMAT_SCHEDULED_DAYS(CA.APPLICABLE_SCHEDULED_DAYS,AC.SCHEDULED_DAYS) IS NOT NULL) )BC GROUP BY BC.SEND_BELONG_NETWORK_CODE, BC.DEPART_CITY_CODE, BC.ARRIVE_CITY_CODE, BC.CAPACITY_NAME ORDER BY BC.FALG DESC; 最后这样处理了,结果是可以了,但有一点没太明白,mysql中的分组后默认是降序,那他是根据什么字段来降序的,能给我解释下么?[/quote] 未处理的表数据是根据主键索引排序,默认升序asc,分组是根据group by后面的字段顺序依次排序,降序可能是因为没有主键默认按照数据插入时间先后排序
枫中叶 2016-07-20
  • 打赏
  • 举报
回复
引用 5 楼 zjcxc 的回复:
create table t(id int auto_increment primary key, name varchar(10), v int);
INSERT t(name,v) values
('a', 1),
('a', null),
('a', 2),
('b', 3),
('b', 1),
('b', null);

-- 每个 name v值最大的那条记录
select * from t a
where id=(select id from t b where a.name=b.name order by b.v desc limit 1);

drop table t;
SELECT BC.CAPACITY_NAME,#运力名称 BC.FLIGHT_TYPE,#航班类型 BC.MILEAGE,#航班里程 BC.CAPACITY_TYPE,#运力类型 BC.IS_STOP,#经停标志 BC.PLANE_TYPE,#机型 #BC.PLANE_TYPE1,#机型 BC.SCHEDULE_FLIGHT_TYPE,#时效性航班类型 1为早航班 2为午航班 3为晚航班 BC.PLAN_SCHEDULED_DAYS,#班期 BC.MAX_LOAD,#机型业载 BC.DEPART_CITY_CODE,#始发城市 BC.DEPART_THR_LETTER_CODE,#始发地机场三字码 BC.ARRIVE_CITY_CODE,#目的地城市 BC.ARRIVE_THR_LETTER_CODE,#目的地机场三字码 BC.PLAN_DEPART_TM,#计划发出时间 BC.PLAN_ARRIVE_TM,#计划到达时间 BC.EFFECTIVE_DT,#航班生效日期 BC.EXPIRY_DT,#航班失效日期 BC.SEND_BELONG_NETWORK_CODE,#发货归属网点 BC.GET_BELONG_NETWORK_CODE,#提货归属网点 BC.FLY_OVER_DAYS,#飞行跨越天数 BC.CARGO_TERMINAL_LOAD,#货站截载时长 BC.LOAD_TIME_OF_CARGO_TERMINAL,#货站最晚截载时间 BC.PLATE_INFO,#打板信息 BC.BOARD_MAX_LOAD,#分板业载 BC.PROTOCOL_WEIGHT,#协议量 BC.AVAIABLE_CABIN_SPACE#可获取舱位 #BC.FALG FROM (SELECT CA.CAPACITY_NAME,#运力名称 CA.FLIGHT_TYPE,#航班类型 CA.MILEAGE,#航班里程 CA.CAPACITY_TYPE,#运力类型 CA.IS_STOP,#经停标志 CA.PLANE_TYPE,#机型 #AC.PLANE_TYPE AS PLANE_TYPE1,#机型 CA.SCHEDULE_FLIGHT_TYPE,#时效性航班类型 1为早航班 2为午航班 3为晚航班 FUNCTION_FORMAT_SCHEDULED_DAYS(CA.APPLICABLE_SCHEDULED_DAYS,AC.SCHEDULED_DAYS)AS PLAN_SCHEDULED_DAYS,#班期 CA.MAX_LOAD,#机型业载 CA.DEPART_CITY_CODE,#始发城市 CA.DEPART_THR_LETTER_CODE,#始发地机场三字码 CA.ARRIVE_CITY_CODE,#目的地城市 CA.ARRIVE_THR_LETTER_CODE,#目的地机场三字码 CA.APPLICABLE_SCHEDULED_DAYS,#班期 CA.PLAN_DEPART_TM,#计划发出时间 CA.PLAN_ARRIVE_TM,#计划到达时间 CA.EFFECTIVE_DT,#航班生效日期 CA.EXPIRY_DT,#航班失效日期 CA.SEND_BELONG_NETWORK_CODE,#发货归属网点 CA.GET_BELONG_NETWORK_CODE,#提货归属网点 CA.FLY_OVER_DAYS,#飞行跨越天数 CA.CARGO_TERMINAL_LOAD,#货站截载时长 CA.LOAD_TIME_OF_CARGO_TERMINAL,#货站最晚截载时间 CA.PLATE_INFO,#打板信息 CA.BOARD_MAX_LOAD,#分板业载 AC.PROTOCOL_WEIGHT,#协议量 AC.AVAIABLE_CABIN_SPACE,#可获取舱位 IF(AC.PLANE_TYPE IS NOT NULL,1,0) FALG FROM TM_AIR_USED_DAILY_CAPACITY CA LEFT JOIN (SELECT * FROM TT_AIR_AVAIABLE_CABIN T WHERE T.EXPIRATION_DATE >= NOW() AND T.IS_USED = 1) AC ON (CA.SEND_BELONG_NETWORK_CODE = AC.SEND_BELONG_NETWORK_CODE AND CA.DEPART_CITY_CODE = AC.DEPART_CITY_CODE AND CA.ARRIVE_CITY_CODE = AC.ARRIVE_CITY_CODE AND CA.CAPACITY_NAME = AC.CAPACITY_NAME AND CA.PLANE_TYPE = IFNULL(AC.PLANE_TYPE,CA.PLANE_TYPE) AND FUNCTION_FORMAT_SCHEDULED_DAYS(CA.APPLICABLE_SCHEDULED_DAYS,AC.SCHEDULED_DAYS) IS NOT NULL) )BC GROUP BY BC.SEND_BELONG_NETWORK_CODE, BC.DEPART_CITY_CODE, BC.ARRIVE_CITY_CODE, BC.CAPACITY_NAME ORDER BY BC.FALG DESC; 最后这样处理了,结果是可以了,但有一点没太明白,mysql中的分组后默认是降序,那他是根据什么字段来降序的,能给我解释下么?
致命的西瓜 2016-07-20
  • 打赏
  • 举报
回复
引用 9 楼 wangjian0228 的回复:
#6是对的,就是利用order by 进行倒序排序,将空值置底,然后limit 1取最上一条,如果业务复杂可以把表结构和逻辑贴出来
5#。。。
致命的西瓜 2016-07-20
  • 打赏
  • 举报
回复
#6是对的,就是利用order by 进行倒序排序,将空值置底,然后limit 1取最上一条,如果业务复杂可以把表结构和逻辑贴出来
ACMAIN_CHM 2016-07-19
  • 打赏
  • 举报
回复
参考下贴中的多种方法 http://blog.csdn.net/acmain_chm/article/details/4126306 [征集]分组取最大N条记录方法征集,及散分....

57,062

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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