友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
第三电子书 返回本书目录 加入书签 我的书架 我的书签 TXT全本下载 『收藏到我的浏览器』

SQL语言艺术(PDF格式)-第13部分

快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!


column_name之前的第n个值。如果使用lag()函数,我们的查询甚至执行得更快——比先前的查 

询大约快25%。 

select timestamp; 

statistic_id; 

(counter …prev_counter) *60/ 

(timestamp …prev_timestamp) 

from (select timestamp; 

statistic_id; 

counter; 

lag(counter;1)over(partition bystatistic_id 

order bytimestamp) prev_counter; 

lag(timestamp; 1)over(partition bystatistic_id 

order bytimestamp) prev_timestamp 

from hit_counter) a 

order bya。timestamp; a。statistic_id 



很多时候,我们的数据并不像航班案例中那样具有对称性。通常,当需要查找和最小、最大、 

最早、或最近的值相关联的数据时,首先必须找到这些值本身(此为第一遍扫描,需比较记录), 

接下来的用这些值作为第二遍扫描的搜索条件。而以滑动窗口(sliding window)为基础的OLAP 

函数,可以将两遍扫描合而为一(至少表面上如此)。基于时间戳或日期的数据查询,非常特殊 

也非常重要,本章在稍后的“基于日期的简单搜索或范围搜索”中专门讨论。 



总结:当多个选取条件用于同一个表的不同记录时,可以使用基于滑动窗口工作的函数。 



基于日期的简单搜索或范围搜索 



Simple orRange Searchingon Dates 



搜索条件有多种,其中日期(和时间)占有特殊地位。日期极为常见,而且比其他数据类型更 

可能成为范围搜索的条件,范围搜索可以是有界的(如“在某两天之间”),也可以是部分有界 

(“在某天之前”)。通常,为了获得这种结果集,查询需要使用当前日期(如“前六个月”)。 



上一节“通过聚合获得结果集”所举的例子,用到了sales_history 表。当时,条件位于amount 上, 

其实对于sales_history这种表更常见的是日期条件,尤其是读取特定日期的数据、或读取两个日 

期之间的数据。在保存历史数据的表中查找特定日期(或其对应值)时,必须特别注意确定当 

前日期的方法,它可能成为聚合条件的基础。 


…………………………………………………………Page 73……………………………………………………………

第1章已指出,设计保存历史数据的表颇为困难,而且没有现成的简单解决方案。无论你对当前 

数据、还是历史数据感兴趣,设计历史数据的存储方案都要根据如何使用数据决定,同时还要 

看数据多快会过时。例如,零售系统中价格的变动速度比较慢(除非正在经受严重的通货膨胀), 

而网络流量或财务设备的价格改变速度比较快,甚至快很多。 

从宏观角度来看,关键是各项历史数据的数量:是“少量数据项、大量历史数据”,还是“大量数 

据项、少量历史数据”,或是介于两者之间?其重点是:数据项的可选择性取决于数据项的总数、 

取样频率(“每天一次”还是“每次改变时”)、时间长短(“永久”还是“一年”等)。因此,本节将首 

先讨论“大量数据项、少量历史数据”的情况,接着讨论“少量数据项、大量历史数据”的情况, 

最后讨论当前值问题。 



大量数据项、少量历史数据 



ManyItems; Few HistoricalValues 



既然没有为每个数据项保留大量历史数据,那么各项的ID可选择性很高。说明要查询哪些项, 

限定参与查询的少数历史记录,就可确定特定日期(当前日期或以前日期)对应的值。这种情 

况需要我们再次处理聚合值(aggregate value)。 



除非建立了代理键(本情况不需要代理键),否则主键通常是复合键,由item_id和record_date组 

成。为了查询特定日期的值,可采用两种方法:子查询和 OLAP 函数。 

使用子查询 

查找某数据项在特定日期的值相对简单,但实际上,这种简单只是假象。通常你会遇到这样的 

代码: 

select whatever 

from hist_data asouter 

where outer。item_id =somevalue 

andouter。record_date =(select max(inner。record_date) 

from hist_data asinner 

where inner。item_id =outer。item_id 

andinner。record_date 
返回目录 上一页 下一页 回到顶部 0 0
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!