首页 > 试题广场 >

流水表中插入切片表数据

[编程题]流水表中插入切片表数据
  • 热度指数:47 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
现在有两个数据表,
A表是某个商品的属性表,schema如下:
---------------------------
sku_id | a1 | a1_datetime |
---------------------------
其中sku_id是商品id;a1是商品的某个属性,例如评论数量;a1_datetime是采集商品属性的时间,每隔固定时间采集一次,如2018-07-01,2018-07-06,2018-07-11等

B表是客户浏览商品的记录表,schema如下:
---------------------------------
user_id | sku_id | buy_datetime |
---------------------------------
其中sku_id是商品id;user_id是客户id;datetime是购买时间,是随机的时间,如2018-07-05,2018-07-08,2018-07-12等

现在希望将A表和B表拼接成为C表,schema为
-------------------------------------------------------------
user_id | sku_id | buy_datetime | a1 | a1_datetime |
-------------------------------------------------------------
要求C表中每个商品sku_id的属性值a1,必须是在购买时刻之前最近的一次采集时间点采集的。



注意:
1.sqlite中时间函数julianday('time'):将返回从格林尼治时间的公元前 4714 年 11 月 24 日正午算起的天数。
2.sqlite中只支持left join,请将right join变成left join
3.sqlite中创建临时表语法是
CREATE TABLE new_table AS
  SELECT expressions
  FROM existing_tables
  [WHERE conditions];


输入描述:
A、B两个数据表


输出描述:
A、B两个数据表
示例1

输入

A表:
+--------+----+-------------+
| sku_id | a1 | a1_datetime |
+--------+----+-------------+
|      1 |  3 | 2018-07-01  |
|      1 |  5 | 2018-07-06  |
|      1 |  7 | 2018-07-11  |
|      2 |  2 | 2018-07-01  |
|      2 |  4 | 2018-07-06  |
|      2 |  6 | 2018-07-11  |
+--------+----+-------------+


B表:
+---------+--------+--------------+
| user_id | sku_id | buy_datetime |
+---------+--------+--------------+
|   10001 |      1 | 2018-07-03   |
|   10002 |      1 | 2018-07-04   |
|   10003 |      1 | 2018-07-07   |
|   10004 |      1 | 2018-07-09   |
|   10005 |      2 | 2018-07-07   |
|   10006 |      2 | 2018-07-19   |
+---------+--------+--------------+

输出

结果( C表 ):
+---------+--------+--------------+------+-------------+
| user_id | sku_id | buy_datetime | a1   | a1_datetime |
+---------+--------+--------------+------+-------------+
|   10001 |      1 | 2018-07-03   |    3 | 2018-07-01  |
|   10002 |      1 | 2018-07-04   |    3 | 2018-07-01  |
|   10003 |      1 | 2018-07-07   |    5 | 2018-07-06  |
|   10004 |      1 | 2018-07-09   |    5 | 2018-07-06  |
|   10005 |      2 | 2018-07-07   |    4 | 2018-07-06  |
|   10006 |      2 | 2018-07-19   |    6 | 2018-07-11  |
+---------+--------+--------------+------+-------------+
先使用不等连接来得到购买时间之前的属性值,然后再通过group by来过滤出最后一个时间的属性值
select
    user_id,
    sku_id,
    buy_datetime,
    a1,
    max(a1_datetime) as a1_datetime
from
    (select
         B.user_id,
         B.sku_id,
         B.buy_datetime,
         A.a1,
         A.a1_datetime
     from B
     left join A on
     A.sku_id=B.sku_id and B.buy_datetime>A.a1_datetime) C
group by user_id, sku_id, buy_datetime
order by user_id, sku_id, buy_datetime;


发表于 2020-12-29 17:18:38 回复(0)