假设您有一个类似于这样的表:
|email | purchase_date |
|:--------------|:---------------------|
|stan@gmail.com | Jun 30 2020 12:00AM |
|stan@gmail.com | Aug 05 2020 5:00PM |
|stan@gmail.com | Mar 22 2018 3:00AM |
|eric@yahoo.com | Aug 05 2020 5:00PM |
|eric@yahoo.com | Mar 22 2018 3:00PM |
|kyle@gmail.com | Mar 22 2018 3:00PM |
|kyle@gmail.com | Jun 30 2020 12:00AM |
|kyle@gmail.com | Aug 05 2020 5:00PM |
|kenny@gmail.com| Aug 05 2020 5:00PM |
完全随机的。我实际使用的数据库实际上更复杂,有更多的列。
两个列都是STRING类型。这是不方便的。购买日期应该是date类型。Kenny只进行了一次购买,因此结果表中不应该有他的任何行。还要注意有很多相同的日期。
我想为每个电子邮件地址选择电子邮件和第二古老的购买日期(命名为'second_purchase'),这样结果看起来像这样:
|email | second_purchase |
|:--------------|:-------------------- |
|stan@gmail.com | Jun 30 2020 12:00AM |
|eric@yahoo.com | Aug 05 2021 5:00PM |
|kyle@gmail.com | Jun 30 2020 12:00AM |
我似乎搞不懂逻辑或语法。我不想把我所有的代码都放在这里,因为我已经尝试了我的想法的许多变体……不知怎么的,这似乎行不通。但我想看到一个例子代码从一个熟练的SQL。我的想法可能不是那么好…:-)
这个版本实际上是SOQL (Salesforce对象查询语言)。这可能很重要。
很抱歉没有正确地样式表,我似乎也没有工作,即使当我使用推荐的样式。我不能发帖。这真的很令人沮丧。
无论如何,谢谢你的帮助!您可以尝试下面的sql,它使用dense_rank
对每个用户的电子邮件和订单通过cast的purchase_date
查询# 1
WITH date_converted_table AS (
SELECT
email,
purchase_date,
DENSE_RANK() OVER (
PARTITION BY email
ORDER BY CAST(purchase_date as timestamp) ASC
) dr
FROM
mytable
)
SELECT
email,
purchase_date as second_purchase
FROM
date_converted_table
WHERE dr=2;
second_purchase | eric@yahoo.com | 2020年8月05下午5:00 | 道明>
---|---|
2020年6月30日12:00点 | |
2020年6月30日12:00点 |