科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道使用DB2 UDB OLAP函数

使用DB2 UDB OLAP函数

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

在线分析处理函数非常灵活,也很强大。通过使用这些函数,您可以为一些问题找到简单的解决方案,而这些问题本来要么是要迭代一个或者多个游标,要么是要进行递归。

来源:IT专家网 2008年6月10日

关键字: IBM 数据库 DB2

  • 评论
  • 分享微博
  • 分享邮件
如果不能创建辅助表,那么使用表表达式并生成连续数会比较容易,像这样:


SELECT ITEM_NAME, PRICE_PER_ITEM FROM SALE_ITEM 
JOIN 
(SELECT ROW_NUMBER() OVER() AS NUM FROM SYSCAT.TABLES) AS NUMBER_SEQ
ON NUMBER_SEQ.NUM <= SALE_ITEM.ITEM_QUANTITY
ORDER BY PRICE_PER_ITEM DESC

结果完全一样,不过性能上慢了一点。

如何使用日历表简化查询
我从 [article on Pivot Tables] 中摘出了这个例子。首先,让我们创建一个表,并插入一些数据:


CREATE TABLE BUSINESS_TRIP(EMPLOYEE_ID INT NOT NULL, DATE_FROM DATE NOT NULL, DATE_TO DATE NOT NULL);
INSERT INTO BUSINESS_TRIP VALUES
(1, DATE('01/06/2003'), DATE('01/10/2003')),
(1, DATE('01/13/2003'), DATE('01/17/2003')),
(1, DATE('01/20/2003'), DATE('01/24/2003')),
(1, DATE('01/27/2003'), DATE('01/31/2003')),
(2, DATE('01/07/2003'), DATE('01/08/2003')),
(3, DATE('01/08/2003'), DATE('01/09/2003'));

假设有一个简单的任务:“选择 2003 年 1 月份没有雇员出差的所有日子”,这时日历表 DATE_SEQ 就很好用了。


SELECT SOME_DATE AS NOBODY_ON_TRIP FROM DATE_SEQ
WHERE SOME_DATE BETWEEN DATE('01/01/2003') AND DATE('01/31/2003')
AND NOT EXISTS(SELECT * FROM BUSINESS_TRIP WHERE SOME_DATE BETWEEN DATE_FROM AND DATE_TO);
NOBODY_ON_TRIP 
-------------- 
01/01/2003     
01/02/2003     
01/03/2003     
01/04/2003     
01/05/2003     
01/11/2003     
01/12/2003     
01/18/2003     
01/19/2003     
01/25/2003     
01/26/2003        
11 record(s) selected.

这个查询非常简单。在[article on Pivot Tables]中讨论了一些肯定是更复杂的替代方案。

假设有一个类似的任务:“选择 2003 年 1 月份有两名以上雇员在出差的所有日子”,同样,这里日历表 DATE_SEQ 也提供了一个非常容易的方法:


SELECT SOME_DATE AS THREE_OR_MORE_ON_TRIP FROM DATE_SEQ
WHERE SOME_DATE BETWEEN DATE('01/01/2003') AND DATE('01/31/2003')
AND (SELECT COUNT(*) FROM BUSINESS_TRIP WHERE SOME_DATE BETWEEN DATE_FROM AND DATE_TO) > 2;

THREE_OR_MORE_ON_TRIP 
------------------- 
01/08/2003  

同样,如果不能创建辅助表,我们就可以使用表表达式:


SELECT SOME_DATE AS THREE_OR_MORE_ON_TRIP 
FROM 
(SELECT DATE('01/01/2003') + ROW_NUMBER() OVER() DAYS AS SOME_DATE FROM SYSCAT.TABLES) AS DATE_SEQ
WHERE SOME_DATE BETWEEN DATE('01/01/2003') AND DATE('01/31/2003')
AND (SELECT COUNT(*) FROM BUSINESS_TRIP WHERE SOME_DATE BETWEEN DATE_FROM AND DATE_TO) > 2;

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章