SQL:第二古老的日期

  • 本文关键字:日期 SQL sql soql
  • 更新时间 :
  • 英文 :


假设您有一个类似于这样的表:

|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;
tbody> <<tr>道明><kyle@gmail.com>道明><stan@gmail.com>
emailsecond_purchase
eric@yahoo.com2020年8月05下午5:00
2020年6月30日12:00点
2020年6月30日12:00点

相关内容

  • 没有找到相关文章

最新更新