课程表的某个SQL语句

最近帮助朋友写了一个于课程表相关的SQL语句,比较经典,简要过程如下:

需求:

       

 

在PostgreSQL测试过程如下:

    

sde=# select * from t1;
    id    | name
----------+------
 20180001 | 张三
 20180002 | 李四
 20180003 | 王五
(3 行记录)


sde=# select * from t2;
    id    | score |    time
----------+-------+------------
 20180001 |    88 | 2018-01-02
 20180002 |    61 | 2018-01-02
 20180001 |    91 | 2018-01-12
 20180002 |    79 | 2018-01-12
 20180001 |    85 | 2018-01-22
 20180002 |    98 | 2018-01-22
(6 行记录)

  第一种方法:

  

sde=#  select t3.id,t3.name,t2.score from
sde-#  (
sde(#     select c.id,c.name as name,max(c.time) as time from
sde(#     (
sde(#           select a.name as name ,a.id as id,b.score as score,b.time as time
sde(#           from t1 a left join t2 b on a.id=b.id
sde(#     )
sde(#     c  group by c.id,c.name
sde(#  ) t3  left join t2 on t3.id=t2.id and t3.time=t2.time;
    id    | name | score
----------+------+-------
 20180001 | 张三 |    85
 20180002 | 李四 |    98
 20180003 | 王五 |
(3 行记录)

  第二种方法(使用with方法):

  

sde=#  with c as
sde-# (
sde(#           select a.name as name ,a.id as id,b.score as score,b.time as time
sde(#           from t1 a left join t2 b on a.id=b.id
sde(#         ),
sde-#         t3 as
sde-#         (
sde(#             select c.id,c.name as name,max(c.time) as time
sde(#             from c group by c.id,c.name
sde(#         )
sde-#         select t3.id,t3.name,t2.score
sde-#         from t3 left join t2 on t3.id=t2.id and t3.time=t2.time;
    id    | name | score
----------+------+-------
 20180001 | 张三 |    85
 20180002 | 李四 |    98
 20180003 | 王五 |
(3 行记录)

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值