Sql 如果发生在另一个时间戳之后,请选择时间戳的最小差值
我有一个表格,显示Sql 如果发生在另一个时间戳之后,请选择时间戳的最小差值,sql,teradata,Sql,Teradata,我有一个表格,显示客户id,产品id,浏览日期,购买日期,以及浏览日期和购买日期之间的差异。看起来像这样 id pID b_Date p_Date Diff 1 001 7/20/2014 7/20/2014 0 1 001 7/20/2014 7/20/2014 0 1 002 7/20/2014 7/20/2014 0 2 001 7/20/2014 7/20/2014 0 2 001 7/20/2014
客户id
,产品id
,浏览日期
,购买日期
,以及浏览日期和购买日期之间的差异。看起来像这样
id pID b_Date p_Date Diff
1 001 7/20/2014 7/20/2014 0
1 001 7/20/2014 7/20/2014 0
1 002 7/20/2014 7/20/2014 0
2 001 7/20/2014 7/20/2014 0
2 001 7/20/2014 8/01/2014 -12
2 002 7/25/2014 8/01/2014 -8
2 002 7/26/2014 8/01/2014 -7
2 002 7/28/2014 8/01/2014 -5
2 002 7/28/2014 8/01/2014 -5
我试图找出客户在购买某一特定产品之前提前多少天开始浏览该产品
然而,对于客户2,他购买了两次。现在,他在2014年7月20日的浏览不应被视为他在2014年8月1日购买的浏览,因为这与7月20日的购买有关
我想知道如何获得上次购买后发生浏览的每个客户的最小差异。另外,我不能在查询中使用pID(产品id)
我使用的是teradata 13.1您的问题对我来说有点模糊,但我认为您是在说,您希望客户
id
购买给定产品时,无论pID
如何,都能获得最低的diff
。下面是完成该操作的准备和后续查询
CREATE MULTISET TABLE danf.table1
(
id INTEGER NOT NULL,
pID VARCHAR(50) CHARACTER SET LATIN NOT CASESPECIFIC,
b_Date DATE FORMAT 'MM/DD/YYYY' ,
p_Date DATE FORMAT 'MM/DD/YYYY' ,
Diff INTEGER
)
PRIMARY INDEX ( id );
INSERT INTO danf.table1 (id, pID, b_Date, p_Date, Diff) VALUES ( 1, '001', CAST('07/20/2014' AS DATE FORMAT 'MM/DD/YYYY'), CAST('07/20/2014' AS DATE FORMAT 'MM/DD/YYYY'), 0 );
INSERT INTO danf.table1 (id, pID, b_Date, p_Date, Diff) VALUES ( 1, '001', CAST('07/20/2014' AS DATE FORMAT 'MM/DD/YYYY'), CAST('07/20/2014' AS DATE FORMAT 'MM/DD/YYYY'), 0 );
INSERT INTO danf.table1 (id, pID, b_Date, p_Date, Diff) VALUES ( 1, '002', CAST('07/20/2014' AS DATE FORMAT 'MM/DD/YYYY'), CAST('07/20/2014' AS DATE FORMAT 'MM/DD/YYYY'), 0 );
INSERT INTO danf.table1 (id, pID, b_Date, p_Date, Diff) VALUES ( 2, '001', CAST('07/20/2014' AS DATE FORMAT 'MM/DD/YYYY'), CAST('07/20/2014' AS DATE FORMAT 'MM/DD/YYYY'), 0 );
INSERT INTO danf.table1 (id, pID, b_Date, p_Date, Diff) VALUES ( 2, '001', CAST('07/20/2014' AS DATE FORMAT 'MM/DD/YYYY'), CAST('08/01/2014' AS DATE FORMAT 'MM/DD/YYYY'), -12 );
INSERT INTO danf.table1 (id, pID, b_Date, p_Date, Diff) VALUES ( 2, '002', CAST('07/25/2014' AS DATE FORMAT 'MM/DD/YYYY'), CAST('08/01/2014' AS DATE FORMAT 'MM/DD/YYYY'), -8 );
INSERT INTO danf.table1 (id, pID, b_Date, p_Date, Diff) VALUES ( 2, '002', CAST('07/26/2014' AS DATE FORMAT 'MM/DD/YYYY'), CAST('08/01/2014' AS DATE FORMAT 'MM/DD/YYYY'), -7 );
INSERT INTO danf.table1 (id, pID, b_Date, p_Date, Diff) VALUES ( 2, '002', CAST('07/28/2014' AS DATE FORMAT 'MM/DD/YYYY'), CAST('08/01/2014' AS DATE FORMAT 'MM/DD/YYYY'), -5 );
INSERT INTO danf.table1 (id, pID, b_Date, p_Date, Diff) VALUES ( 2, '002', CAST('07/28/2014' AS DATE FORMAT 'MM/DD/YYYY'), CAST('08/01/2014' AS DATE FORMAT 'MM/DD/YYYY'), -5 );
SELECT
t1.id
,MAX(b_Date) AS Max_b_Date
,t1.p_Date
,MAX(t1.Diff) AS Min_Diff
FROM danf.table1 t1
GROUP BY
t1.id,
t1.p_Date;
以下是基于您提供的数据集的结果:
id Max_b_Date p_Date Min_Diff
1 2014-07-20 2014-07-20 0
2 2014-07-20 2014-07-20 0
2 2014-07-28 2014-08-01 -5
还有我用来在Teradata 13.1中重现你的问题的代码
CREATE MULTISET TABLE danf.table1
(
id INTEGER NOT NULL,
pID VARCHAR(50) CHARACTER SET LATIN NOT CASESPECIFIC,
b_Date DATE FORMAT 'MM/DD/YYYY' ,
p_Date DATE FORMAT 'MM/DD/YYYY' ,
Diff INTEGER
)
PRIMARY INDEX ( id );
INSERT INTO danf.table1 (id, pID, b_Date, p_Date, Diff) VALUES ( 1, '001', CAST('07/20/2014' AS DATE FORMAT 'MM/DD/YYYY'), CAST('07/20/2014' AS DATE FORMAT 'MM/DD/YYYY'), 0 );
INSERT INTO danf.table1 (id, pID, b_Date, p_Date, Diff) VALUES ( 1, '001', CAST('07/20/2014' AS DATE FORMAT 'MM/DD/YYYY'), CAST('07/20/2014' AS DATE FORMAT 'MM/DD/YYYY'), 0 );
INSERT INTO danf.table1 (id, pID, b_Date, p_Date, Diff) VALUES ( 1, '002', CAST('07/20/2014' AS DATE FORMAT 'MM/DD/YYYY'), CAST('07/20/2014' AS DATE FORMAT 'MM/DD/YYYY'), 0 );
INSERT INTO danf.table1 (id, pID, b_Date, p_Date, Diff) VALUES ( 2, '001', CAST('07/20/2014' AS DATE FORMAT 'MM/DD/YYYY'), CAST('07/20/2014' AS DATE FORMAT 'MM/DD/YYYY'), 0 );
INSERT INTO danf.table1 (id, pID, b_Date, p_Date, Diff) VALUES ( 2, '001', CAST('07/20/2014' AS DATE FORMAT 'MM/DD/YYYY'), CAST('08/01/2014' AS DATE FORMAT 'MM/DD/YYYY'), -12 );
INSERT INTO danf.table1 (id, pID, b_Date, p_Date, Diff) VALUES ( 2, '002', CAST('07/25/2014' AS DATE FORMAT 'MM/DD/YYYY'), CAST('08/01/2014' AS DATE FORMAT 'MM/DD/YYYY'), -8 );
INSERT INTO danf.table1 (id, pID, b_Date, p_Date, Diff) VALUES ( 2, '002', CAST('07/26/2014' AS DATE FORMAT 'MM/DD/YYYY'), CAST('08/01/2014' AS DATE FORMAT 'MM/DD/YYYY'), -7 );
INSERT INTO danf.table1 (id, pID, b_Date, p_Date, Diff) VALUES ( 2, '002', CAST('07/28/2014' AS DATE FORMAT 'MM/DD/YYYY'), CAST('08/01/2014' AS DATE FORMAT 'MM/DD/YYYY'), -5 );
INSERT INTO danf.table1 (id, pID, b_Date, p_Date, Diff) VALUES ( 2, '002', CAST('07/28/2014' AS DATE FORMAT 'MM/DD/YYYY'), CAST('08/01/2014' AS DATE FORMAT 'MM/DD/YYYY'), -5 );
SELECT
t1.id
,MAX(b_Date) AS Max_b_Date
,t1.p_Date
,MAX(t1.Diff) AS Min_Diff
FROM danf.table1 t1
GROUP BY
t1.id,
t1.p_Date;