我有这样的数据集:
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.任何想法?
答案 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.
此外,您可能需要重新考虑使用的字段名称,如果不是太晚,user
和date
都被找到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
此致