Hive 在给定的日期配置单元上选择所有日期、所有客户以及客户的最后一笔交易的截止日期

Hive 在给定的日期配置单元上选择所有日期、所有客户以及客户的最后一笔交易的截止日期,hive,hiveql,Hive,Hiveql,我在蜂箱上有3张桌子: -日历表(包含给定期间的所有日期) -客桌 -客户的交易清单 我需要加入这些,以便获得给定日期的所有客户及其在该日期之前的最后一笔交易。只有在该日期之前没有交易(我的意思是,在当前日历记录之前的最后一笔交易)时,最后一笔交易才应为空 日历示例: +----------+ |date | +----------+ |2017-06-01| |2017-06-02| |2017-06-03| |2017-06-04| |2017-06-05| |2017-06-06

我在蜂箱上有3张桌子: -日历表(包含给定期间的所有日期) -客桌 -客户的交易清单

我需要加入这些,以便获得给定日期的所有客户及其在该日期之前的最后一笔交易。只有在该日期之前没有交易(我的意思是,在当前日历记录之前的最后一笔交易)时,最后一笔交易才应为空

日历示例:

+----------+
|date      |
+----------+
|2017-06-01|
|2017-06-02|
|2017-06-03|
|2017-06-04|
|2017-06-05|
|2017-06-06|
|2017-06-07|
|2017-06-08|
|2017-06-09|
|2017-06-10|
+----------+
客户样本:

+------------+
|customer_id |
+------------+
|11544049690 |
|15506698252 |
|67015354024 |
|43622453087 |
|509         |
|42859528435 |
|506         |
|10669246896 |
|33355892704 |
|500         |
+------------+
交易样本:

+------------+----------+
|customer_id |trx_date  |
+------------+----------+
|43622453087 |2018-05-30|
|509         |2017-10-04|
|509         |2018-01-09|
|509         |2017-11-07|
|509         |2018-01-30|
|506         |2017-10-04|
|506         |2017-12-21|
|506         |2017-11-07|
|506         |2017-11-07|
|500         |2017-10-04|
+------------+----------+
结果大致如下:

+----------+------------+--------------+
|date      |customer_id |last_trx_date |
+----------+------------+--------------+
|2017-10-04|11544049690 |              |
|2017-10-04|15506698252 |              |
|2017-10-04|67015354024 |              |
|2017-10-04|43622453087 |              |
|2017-10-04|509         |2017-10-04    |
|2017-10-04|42859528435 |              |
|2017-10-04|506         |2017-10-04    |
|2017-10-04|10669246896 |              |
|2017-10-04|33355892704 |              |
|2017-10-04|500         |2017-10-04    |
|2017-10-05|11544049690 |              |
|2017-10-05|15506698252 |              |
|2017-10-05|67015354024 |              |
|2017-10-05|43622453087 |              |
|2017-10-05|509         |2017-10-04    |
|2017-10-05|42859528435 |              |
|2017-10-05|506         |2017-10-04    |
|2017-10-05|10669246896 |              |
|2017-10-05|33355892704 |              |
|2017-10-05|500         |2017-10-04    |
|2017-10-06|11544049690 |              |
|2017-10-06|15506698252 |              |
|2017-10-06|67015354024 |              |
|2017-10-06|43622453087 |              |
|2017-10-06|509         |2017-10-04    |
|2017-10-06|42859528435 |              |
|2017-10-06|506         |2017-10-04    |
|2017-10-06|10669246896 |              |
|2017-10-06|33355892704 |              |
|2017-10-06|500         |2017-10-04    |
.
.
.
|2017-11-07|11544049690 |              |
|2017-11-07|15506698252 |              |
|2017-11-07|67015354024 |              |
|2017-11-07|43622453087 |              |
|2017-11-07|509         |2017-11-07    |
|2017-11-07|42859528435 |              |
|2017-11-07|506         |2017-11-07    |
|2017-11-07|10669246896 |              |
|2017-11-07|33355892704 |              |
|2017-11-07|500         |2017-10-04    |
+----------+------------+--------------+
最后一次尝试是这样的: 这是最后一次尝试:

SELECT

    cal.date as calendar_date,
    c.customer_id,
    to_date(trx.tstamp) as trx_date,
    max(to_date(trx.tstamp)) over (
        order by trx.date, trx.customer_id rows unbounded preceding) as last_trx
    FROM
       calendartable cal
    LEFT JOIN customer t1
    LEFT JOIN transactions t2          
    ON (c.customer_id == trx.customer_id) 

    WHERE to_date(cal.date) <= current_date or cal.date is null
选择
cal.date作为日历日期,
c、 客户识别码,
截止日期(trx.tstamp)作为trx_日期,
最大值(截止日期(trx.tstamp))超过(
订单按trx.date、trx.customer\u id行(前面无限制)作为最后一个\u trx
从…起
日历表校准
左连接客户t1
左连接事务t2
ON(c.customer\u id==trx.customer\u id)

WHERE to_date(cal.date)需要交叉联接来为每个客户的日历表中的每个日期生成行。然后,使用聚合的
左连接将产生所需的结果

SELECT cal.date as calendar_date,
cst.customer_id,
max(to_date(trx.tstamp)) as last_trx
FROM calendartable cal
CROSS JOIN customer cst
LEFT JOIN transactions trx ON cst.customer_id = trx.customer_id AND trx.tstamp <= cal.dt
WHERE to_date(cal.date) <= current_date 
GROUP BY cal.date,cst.customer_id
选择cal.date作为日历日期,
cst.customer_id,
最大值(截止日期(trx.tstamp))作为最后一次trx
从日历表cal
交叉连接客户cst

LEFT JOIN transactions trx ON cst.customer_id=trx.customer_id和trx.tstamp请包括您的尝试。查询很有帮助,但是我需要获得客户在给定日期之前的最后一笔交易。例如,我有2016-10-09日历,我有2017-02-07的交易。上次交易日期需要更改,或者我通过将
max(to_date(trx.tstamp))更改为Last_trx
max(if(to_date)(trx.tstamp))显然能够获得所需的结果