sql-min(date)

lztngnrs  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(267)

我们做了一个推广,用户可以免费收到他们的第一个订阅订单。价格=$0.00当用户使用促销。我对示例a中的数据感兴趣。
示例a-用户50从促销开始,持续了两个月

order_id  user_id    price    created_at
    1        50       0.00    2018-01-15
    5        50      20.00    2018-02-15
    9        50      20.00    2018-03-15

示例b-用户100已经是一个活跃的订户,他取消了帐户并用促销重新激活,我不想把他算在内

order_id  user_id    price    created_at
    2        100      20.00    2018-01-16
    3        100       0.00    2018-01-17
    7        100      20.00    2018-02-17

--这是我的问题--

这将返回具有多个订单的所有用户
其中至少有一个订单的价格为0.00
-此数据集返回示例a和示例b
--我的问题--
这些数据大部分是正确的(示例a),但我想省略其中的一小部分,因为它们扭曲了我的数据(示例b)。我想删除示例b用户。
我想把第一个订单不是促销品的人除名。
我怎样才能要求他们的第一个订单的价格为0.00?我在想敏的事?

jhkqcmku

jhkqcmku1#

您可以使用以下方法获得第一个订单的时间:

select user_id, min(created_at) as min_ca
from t
group by user_id;

接下来,您可以使用以下公式获得第一个订单的价格:

select oi.*
from order_items oi join
     (select user_id, min(created_at) as min_ca
      from order_items oi
      group by user_id
     ) ooi
     on oi.user_id = ooi.user_id and oi.created_at = ooi.min_ca
where oi.price = 0.00;

然后你就可以用 join , in ,或 exists ;

select oi.*
from order_items oi join
     order_items oi1
     on oi.user_id = oi1.user_id join
     (select user_id, min(created_at) as min_ca
      from order_items oi
      group by user_id
     ) u1
     on oi1.user_id = u1.user_id and oi1.created_at = u1.min_ca
where oi1.price = 0.00;
thigvfpy

thigvfpy2#

你可以用 EXISTS 为了检查零价格的记录没有更早的记录 created_at :

SELECT COUNT(*), user_id
FROM Promo
WHERE user_id IN (
    -- Query below yields [user_id]s of users who got the promo
    -- that wasn't a result of a cancellation and re-activation
    SELECT user_id
    FROM Promo p
    WHERE p.price = 0 AND NOT EXISTS (
        -- Look for a record with the same user ID and an earlier date
        -- than p.created_at, which is the date of the promo with 0.00 price
        SELECT *
        FROM Promo pp
        WHERE pp.user_id=p.user_id AND pp.created_at < p.created_at
    )
)
GROUP BY user_id

相关问题