【问题标题】:Filtering date With SQL使用 SQL 过滤日期
【发布时间】:2022-01-10 20:57:59
【问题描述】:

我有这样的表:

customer_id    date    order_id
12           1/11/2021     2
12           22/11/2021    3
12           31/11/2021    5
42           1/11/2021     2
42           15/11/2021    2
42           31/11/2021    2
43           22/11/2021    1
43           25/11/2021    2

也门我想只选择他们第一次和最后一次购买之间有 30 天的customer_id,然后与产品表进行联接,这意味着:

customer_id    date    order_id   Product_name
12           1/11/2021     2         apple
12           22/11/2021    3         car
12           31/11/2021    5         orange
42           1/11/2021     2         apple
42           15/11/2021    2         apple
42           31/11/2021    2         apple

例如:

select customer_id, date, order_id, product_name
left join product on order_id = product_id
where customer_id.max(date) - customer_id.min(date) = 30 

【问题讨论】:

  • 31/11/2021 是几号?
  • 显示的所有数据均介于 30 天内每位客户的首次购买和最后一次购买之间。你能扩展你的样本数据集来理解这一点吗?
  • 我已经扩展了我的例子,如果你注意第二个表,只有客户ID,即第一次购买和最后一次购买之间的30天。
  • 日期 31/11/2021 只是示例
  • @AminJebeli 11 月没有 31 天 - 这就是评论的重点。

标签: sql sql-server date datetime


【解决方案1】:

选择符合条件的原始行

select customer_id, date, order_id
from 
    (select customer_id, date, order_id
     , max(date) over (partition by customer_id) dmax
     , min(date) over (partition by customer_id) dmin
     from myTable
    ) t
where date in (dmax, dmin) and datediff(day, dmin, dmax) = 30  

在 order_id = product_id 上加入输出和Products

select s.*, p.product_name
from (
    select customer_id, date, order_id
    from 
        (select customer_id, date, order_id
         , max(date) over (partition by customer_id) dmax
         , min(date) over (partition by customer_id) dmin
         from myTable
        ) t
    where date in (dmax, dmin) and datediff(day, dmin, dmax) = 30  
) s
join Product p on s.order_id = p.product_id;

【讨论】:

  • 赞成,但我猜 OP 意味着 30 天或更多
  • @jarlh, .. 很有可能,只需在查询中将 '=' 替换为 '>='
  • 我在问题中添加了新信息,请再次检查您的答案并根据需要进行编辑
  • @AminJebeli,添加加入获取产品名称
【解决方案2】:

答案:

如果我理解正确并且您只想选择客户 ID,则可以选择使用 GROUP BYHAVINGDATEDIFF() 的语句:

SELECT customer_id
FROM (VALUES
   (12, CONVERT(date, '20211101'), 2),
   (12, CONVERT(date, '20211122'), 3),
   (12, CONVERT(date, '20211130'), 5),
   (42, CONVERT(date, '20211101'), 2),
   (42, CONVERT(date, '20211231'), 2),
   (43, CONVERT(date, '20211122'), 1)
) t (customer_id, date, order_id)
GROUP BY customer_id
HAVING DATEDIFF(day, MIN(date), MAX(date)) = 30

结果:

customer_id
12
43

更新:

看来,您需要的是订单信息,而不是客户 ID:

SELECT *
FROM Orders o
JOIN Products p ON o.order_id = p.product_id
WHERE EXISTS (
   SELECT 1
   FROM Orders
   WHERE customer_id = o.customer_id
   GROUP BY customer_id
   HAVING DATEDIFF(day, MIN(date), MAX(date)) = 30
)

【讨论】:

  • 如果我想使用该查询加入另一个名为产品的表,我需要做什么?
  • @AminJebeli,在问题中发布附加信息和示例数据,或提出其他问题。
  • 我在问题中添加了新信息
  • @AminJebeli,使用JOIN。答案已更新。
猜你喜欢
  • 1970-01-01
  • 2012-12-09
  • 2013-04-17
  • 1970-01-01
  • 2016-07-27
  • 1970-01-01
  • 1970-01-01
  • 2021-09-01
  • 2019-11-20
相关资源
最近更新 更多