oracle 获取下月初,如何从oracle sql获取下个月的条目?

这是一种方式(跛足商计算作为练习留给读者):

CREATE TABLE scores (user_id VARCHAR2(32), test_date DATE, score NUMBER);

INSERT INTO scores VALUES('U1',SYSDATE-61, 85);

INSERT INTO scores VALUES('U1',SYSDATE-31, 89);

INSERT INTO scores VALUES('U1',SYSDATE, 92);

INSERT INTO scores VALUES('U2',SYSDATE-61, 65);

INSERT INTO scores VALUES('U2',SYSDATE-31, 89);

INSERT INTO scores VALUES('U2',SYSDATE, 84);

COMMIT;

SELECT s1.user_id, s1.test_date, s2.score-s1.score delta

FROM scores s1

JOIN (SELECT user_id, trunc(test_date,'MM') test_date, score FROM scores) s2

ON (s1.user_id = s2.user_id AND

trunc(add_months(s1.test_date,1),'MM') = s2.test_date);

USER_ID TEST_DATE DELTA

-------------------------------- --------- ----------

U1 9/15/2009 3

U1 8/16/2009 4

U2 9/18/2009 -5

U2 8/19/2009 24

编辑:这是一个缓慢的下午,所以我决定研究10g提供的这个分析函数(进一步拖入本世纪;-),并使用LAG函数重写上述内容:

SELECT user_id, test_date, score

, LAG(score, 1, NULL) OVER (PARTITION BY user_id ORDER BY test_date DESC) - score delta

, LAG(score, 1, NULL) OVER (PARTITION BY user_id ORDER BY test_date DESC) AS next_score

FROM scores

ORDER BY 1, 2 DESC;

哪个产生:

USER_ID TEST_DATE SCORE DELTA NEXT_SCORE

-------------------------------- ----------- ---------- ---------- ----------

U1 10/19/2009 92

U1 9/18/2009 89 3 92

U1 8/19/2009 85 4 89

U2 10/19/2009 84

U2 9/18/2009 89 -5 84

U2 8/19/2009 65 24 89

看,马!没有自我加入!现在,这是光滑的;-)(另外,解释计划表明自我加入不是那么有效)。

作为跳板,我从这个asktom.com问题开始。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值