mysql高选择性查询

时间:2016-04-21 16:50:02

标签: mysql sql

我有这样的数据集:

User    Date    Status
Eric    1/1/2015    4
Eric    2/1/2015    2
Eric    3/1/2015    4
Mike    1/1/2015    4
Mike    2/1/2015    4
Mike    3/1/2015    2

我试图编写一个查询,我将检索其最近交易状态为4的用户。如果它不是4,我不想在该用户中看到该用户结果。该数据集可能有2个可能的结果,一个用于Eric,一个用于Mike。但是,迈克最近的交易不是4,因此:

返回结果将是:

User    Date    Status
Eric    3/1/2015    4

由于此记录是Eric的唯一记录,其最新交易日期为4。

这是我迄今为止所做的尝试:

SELECT
   user, MAX(date) as dates, status
FROM
   orders
GROUP BY
   status,
   user

这将使我获得每个状态类型的每个用户的unqiue记录。这将是一个子查询,父查询将如下所示:

SELECT
   user, dates, status
WHERE 
   status = 4
GROUP BY
   user

然而,这显然是有缺陷的,因为我不想要状态= 4记录,如果他们最近的记录不是4.我只想在最新日期为4时状态= 4.任何想法?

3 个答案:

答案 0 :(得分:2)

SELECT user, date 
    , actualOrders.status
FROM (
   SELECT user, MAX(date) as date
   FROM orders
   GROUP BY user) AS lastOrderDates
INNER JOIN orders AS actualOrders USING (user, date)
WHERE actualOrders.status = 4
;
-- Since USING is being used, there is not a need to specify source of the
-- user and date fields in the SELECT clause; however, if an ON clause was
-- used instead, either table could be used as the source of those fields.

此外,您可能需要重新考虑使用的字段名称,如果不是太晚,userdate都被找到here

答案 1 :(得分:0)

SELECT user, date, status FROM
(
   SELECT user, MAX(date) as date, status FROM orders GROUP BY user
)
WHERE status = 4

答案 2 :(得分:0)

最简单的方法是在您的from子句中的子查询中再次包含您的订单表,以便检索每个用户的最后日期。然后,您可以添加where子句以匹配每个用户的最新日期,最后过滤状态。

select orders.*
from orders,
(
    select ord_user, max(ord_date) ord_date
    from orders
    group by ord_user
) latestdate
where orders.ord_status = 4
    and orders.ord_user = latestdate.ord_user
    and orders.ord_date = latestdate.ord_date

另一种选择是使用over partition子句: Oracle SQL query: Retrieve latest values per group based on time

此致