ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
12
返回列表 发新帖
楼主: zhouzhongchi

[求助] sql查询语句求助

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-7-27 15:06 | 显示全部楼层
hope9966 发表于 2015-7-27 13:43
我给的语句,是默认时间升序,小于某一个时间点的数据是一组数(有很多数),哪么这组数中最后一个数就是 这 ...

是的。
我想知道的是:无论ymd列的顺序,版主的语句中的max是否可以用first代替。
仅示例数据而言,似乎可以。
但因为数据量少,不敢确定。所以想了解连接时到底是如何匹配的(顺序)
假设表如下:
name        ymd
a        7月1日
a        7月2日
a        7月3日
select * from table a left join table b on a.name=b.name and a.ymd>b.ymd
随意改变ymd列的顺序,比较返回结果有顺序有啥规律没?

TA的精华主题

TA的得分主题

发表于 2015-7-27 16:12 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
zhouzhongchi 发表于 2015-7-27 15:06
是的。
我想知道的是:无论ymd列的顺序,版主的语句中的max是否可以用first代替。
仅示例数据而言,似 ...

我初学,只做参考:

试过多表查询,顺序有优化,不是正常顺序的,
数据源升序为前提,
如果b连表从上往下检索,可以用last
如果b连表从下往上检索,可以用first
如果检索优化不清楚,不可以替代。

况且,由这个条件a.ymd>b.ymd得到的一组b.ymd本身就是小于某一时间点的数组,这组数里最大的时间一定是最接近某一时间点的时间,要是我,一定用MAX(b.ymd),这同时的好处还有数据源可以不排序。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2015-7-27 22:13 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 gpk 于 2015-7-27 22:14 编辑
zhouzhongchi 发表于 2015-7-27 15:06
是的。
我想知道的是:无论ymd列的顺序,版主的语句中的max是否可以用first代替。
仅示例数据而言,似 ...

版主的代码:
select t1.id,t1.name,t1.ymd,t1.today,t2.PRICE as yesterday,today-yesterday as [+-] from
(select A.id,A.NAME,A.YMD,A.PRICE AS today,MAX(B.YMD) AS BYMD FROM [ovrn$]A
LEFT JOIN
[ovrn$]B
ON A.NAME=B.NAME AND A.YMD>B.YMD
GROUP BY A.id,A.NAME,A.YMD,A.PRICE)t1
left join
[ovrn$]t2
on t1.name=t2.name and t1.bymd=t2.ymd



你可以把语句拆分开了,版主语句外层是t1 left join t2,

t1的语句是:

select A.id,A.NAME,A.YMD,A.PRICE AS today,MAX(B.YMD) AS BYMD FROM [ovrn$]A
LEFT JOIN
[ovrn$]B
ON A.NAME=B.NAME AND A.YMD>B.YMD
GROUP BY A.id,A.NAME,A.YMD,A.PRICE

你新建一个sheet1,用上面t1的语句生成表,然后在边上用下面的语句,对比下就知道了:

select A.id,A.NAME,A.YMD,A.PRICE AS today,MAX(B.YMD) AS BYMD FROM [ovrn$]A
LEFT JOIN
[ovrn$]B
ON A.NAME=B.NAME AND B.YMD>A.YMD
GROUP BY A.id,A.NAME,A.YMD,A.PRICE


版主的自动结转库存语句我就是这样将过渡表一个个做出来才理解的。

供参考


ps:max是最大值,last是表中最后一行值,first是表中第一行的值,虽然某些情况下等同,但是根据数据的规律,max通用性更好,如果非要用last的话,就得保证源数据按日期顺序排序的,这样last返回的结果等同于max返回的结果。


评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-7-27 23:20 | 显示全部楼层
hope9966 发表于 2015-7-27 16:12
我初学,只做参考:

试过多表查询,顺序有优化,不是正常顺序的,

谢谢!这下我不用纠结了。

TA的精华主题

TA的得分主题

发表于 2021-11-27 21:09 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
最近在研究sql语句,总是在想如何构思这些语句的?是根据想要的结果反推算式的吗?
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-25 14:39 , Processed in 0.044878 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表