查询以获取亚马逊红移中给定日期到 48 小时内的数据

Posted

技术标签:

【中文标题】查询以获取亚马逊红移中给定日期到 48 小时内的数据【英文标题】:Query to fetch data from given date to 48 hrs in amazon red shift 【发布时间】:2016-01-28 08:04:59 【问题描述】:

使用 redshift 中的数据,我们需要了解 48 小时内在一个平台上购物并在另一个数字平台上购买的 id 的数量。

每个平台都有一个单独的事实表,用户 ID 在所有表中都是通用的。

我正在尝试使用以下代码,但没有用。非常感谢任何帮助。

Select Distinct a.id ,
b.login androidLogin,
c.login iPadLogin,
d.login iPhoneLogin,
e.login MobileLogin,
f.login WebLogin
from
users a inner join
fct_android_20160101_20160331 b 
on a.id = b.userid 
inner join  
fct_ipad_20160101_20160331 c 
on a.id = c.userid
inner join
fct_iphone_20160101_20160331 d 
on a.id = d.userid
inner join
fct_mobilepolaris_20160101_20160331 e 
on a.id = e.userid
inner join
fct_polaris_20160101_20160331 f
on a.id = f.userid
where (b.date between '2016-01-01' and dateadd(day,2,date))
or (c.date between '2016-01-01' and dateadd(day,2,date)) 
or (d.date between '2016-01-01' and dateadd(day,2,date))
or (e.date between '2016-01-01' and dateadd(day,2,date)) 
or (f.date between '2016-01-01' and dateadd(day,2,date))
and id > 0 
and id <> 'null'
 and length(Id) = 10 
 and LEFT(Id,1) IN ('0','1','2','3','4','5','6','7','8','9')
order by 1
;

【问题讨论】:

【参考方案1】:

您需要LEFT JOIN 表格。做一个普通的JOIN意味着你将只检索那些在该期间在所有平台上购买过东西的ids。这样做并清理你得到的格式,更具可读性:

SELECT DISTINCT a.id,
                b.login AndroidLogin,
                c.login iPadLogin,
                d.login iPhoneLogin,
                e.login MobileLogin,
                f.login WebLogin
FROM users a
LEFT JOIN fct_android_20160101_20160331 b       ON a.id = b.userid AND b.date BETWEEN '2016-01-01' AND '2016-01-03'
LEFT JOIN fct_ipad_20160101_20160331 c          ON a.id = c.userid AND c.date BETWEEN '2016-01-01' AND '2016-01-03'
LEFT JOIN fct_iphone_20160101_20160331 d        ON a.id = d.userid AND d.date BETWEEN '2016-01-01' AND '2016-01-03'
LEFT JOIN fct_mobilepolaris_20160101_20160331 e ON a.id = e.userid AND e.date BETWEEN '2016-01-01' AND '2016-01-03'
LEFT JOIN fct_polaris_20160101_20160331 f       ON a.id = f.userid AND f.date BETWEEN '2016-01-01' AND '2016-01-03'
WHERE length(a.id) = 10 
  AND left(a.id,1) IN ('0','1','2','3','4','5','6','7','8','9')
ORDER BY 1;

【讨论】:

优秀。感谢您的澄清。您能否帮助查看用户是否在 48 小时内登录了一个平台并在另一个平台上进行了购买。例如,如果 id 'a' 已于 2016 年 1 月 1 日登录到 android,我想写一个查询,如果相同的 id 在 2 天内使用过任何其他平台。希望我说清楚了。我是新用户,需要一些帮助。在此先感谢。 一般方法是UNION 5 个平台表,然后SELECT DISTINCT loginGROUP BY login HAVING count(*) &gt; 1。但是如果你想得到一个确定的答案,你真的应该把它作为一个新问题并发布表格结构。

以上是关于查询以获取亚马逊红移中给定日期到 48 小时内的数据的主要内容,如果未能解决你的问题,请参考以下文章

从亚马逊红移中选择最大嵌套 ID

使用字符串函数反序列化亚马逊红移中的 php 对象

亚马逊红移中的 SQL 正则表达式 substr 函数

动态地将行旋转到红移中的列

如何从亚马逊红移中的字符串中删除非数字字符(句号“。”除外)

红移中的正则表达式