ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] sql查询语句求助

[复制链接]

TA的精华主题

TA的得分主题

发表于 2015-7-23 16:46 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 zhouzhongchi 于 2015-7-23 17:32 编辑

学习select查询语句有段时间了,无奈却无法提高,敬请帮助,谢谢!
具体问题见附件 sql查询求助.zip (10.82 KB, 下载次数: 41)

其中ovrn为源数据,query为查询结果

TA的精华主题

TA的得分主题

发表于 2015-7-23 23:41 | 显示全部楼层
  1. select t1.id,t1.name,t1.ymd,t1.today,t2.PRICE as yesterday,today-yesterday as [+-] from
  2. (select A.id,A.NAME,A.YMD,A.PRICE AS today,MAX(B.YMD) AS BYMD FROM [ovrn$]A
  3. LEFT JOIN
  4. [ovrn$]B
  5. ON A.NAME=B.NAME AND A.YMD>B.YMD
  6. GROUP BY A.id,A.NAME,A.YMD,A.PRICE)t1
  7. left join
  8. [ovrn$]t2
  9. on t1.name=t2.name and t1.bymd=t2.ymd
复制代码

评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-7-24 00:05 | 显示全部楼层

谢谢版主!这么晚了还有劳大驾,实在太荣幸了。
容我好好消化,不懂的地方还得请教老师。
再次感谢!祝好!

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-7-24 12:12 | 显示全部楼层

版主的语句我啃了一上年,似乎明白了。请问其中的max可以用first替换吗,求确认?
另hope9966 给出了另一种写法:
  1. select id,name,ymd,price as today,(select last(price) from [ovrn$] where a.name=name and a.ymd>ymd) as yesterday,today-yesterday as [+-] from [ovrn$] a
复制代码

能否请版主解释下:1.采用的是什么连接方式
2.没有进行group by 分组操作为何可以last聚集运算,在什么不同情况下使用last或first

TA的精华主题

TA的得分主题

发表于 2015-7-25 23:55 | 显示全部楼层
zhouzhongchi 发表于 2015-7-24 12:12
版主的语句我啃了一上年,似乎明白了。请问其中的max可以用first替换吗,求确认?
另hope9966 给出了另 ...

问题一:
属于子查询。主查询的每一条记录分别运行一次,然后子查询再运行一次,通过关联条件返回记录。记录越多效率越低。若非必要,通常不建议使用子查询。
问题二:
GROUP BY 和聚合函数并非充分必要条件。也就是说,不是存在GROUP BY子句 就一定要使用聚合函数,同样地,不是使用了聚合函数就一定要使用GROUP BY子句。只不过,GROUP BY子句通常都会和聚合函数结合使用。
例如:
SELECT 成绩 FROM [成绩表$] GROUP BY 成绩
此语句就没有使用聚合函数。返回的是成绩的不重复值。

SELECT MAX(成绩) AS 最高分 FROM [成绩表$]
此语句没有使用GROUP BY子句,返回的是成绩表成绩的最大值。

但是,若然存在GROUP BY子句,那么,在SELECT子句中列出的字段,除非作为聚合函数的一部分,或由插入常量构成,分则,这些字段必须存在于GROUP BY子句中。

LAST的运行,是根据关联条件a.name=name and a.ymd>ymd进行分段提取符合条件记录中的最后一条记录。若没有此条件,则直接调取子查询表所有记录的最后一条记录。

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2015-7-26 21:12 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
还有,我给的哪个句子,有个毛病,数据源时间需要升序排列,否则出错

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-7-27 12:17 | 显示全部楼层
本帖最后由 zhouzhongchi 于 2015-7-27 12:26 编辑
hope9966 发表于 2015-7-26 21:12
还有,我给的哪个句子,有个毛病,数据源时间需要升序排列,否则出错


朋友,你太谦虚了。
就示例的数据来说,数据规范就要求是升序的,自然也就不是什么毛病哈。当然类似求最接近的最大或最小,安全的做法是使用MIN或Max。
问题1:不知first/last比较min/max谁的效率更高?
另:on a.id>b.id
不明白连接时的原理,原来以为是从上到下逐行扫描。通过这个发现似乎是:查询引擎默认数据是升序的,它总是从物理表中最近的那条记录开始,直到全部数据扫描完成。
如果答案是肯定的,那么就可以放心的使用First/Last代替max/min了

TA的精华主题

TA的得分主题

发表于 2015-7-27 13:35 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
first/last比较min/max

这两组没有可比较性的,first/last是先后(位置),min/max是大小
说白了,现在有一组数,我们要输出最大数,如果这个最大数不在这组数的最前面(就是不在第一行),哪么你用first就是错的,只能用MAX

TA的精华主题

TA的得分主题

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

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-7-27 14:49 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
hope9966 发表于 2015-7-27 13:35
first/last比较min/max

这两组没有可比较性的,first/last是先后(位置),min/max是大小

当然是两类不同的函数:位置/值
我是在胡乱猜想来的:在数据库中的数据如果包括位置和值两个属性,可能查找其位置更快。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-25 14:49 , Processed in 0.035761 second(s), 15 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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