Вы можете получить последние два аккаунта, используя row_number()
.
SELECT *
FROM (SELECT *,
row_number() OVER (PARTITION BY a1.userid
ORDER BY a1.created_at DESC) rn
FROM account a1) a2
WHERE a2.rn <= 2;
Но при этом также будут возвращаться отдельные учетные записи (на пользователя). Если вы не хотите, чтобы присоединиться к подзапросу, получая количество учетных записей для каждого пользователя и проверьте, является ли это число> = 2.
SELECT *
FROM (SELECT *,
row_number() OVER (PARTITION BY a1.userid
ORDER BY a1.created_at DESC) rn
FROM account a1) a2
INNER JOIN (SELECT a3.userid,
count(*) c
FROM account a3
GROUP BY a3.userid) a4
ON a4.userid = a2.userid
WHERE a2.rn <= 2
AND a4.c >= 2;
Но вы также можете напрямую идентифицировать эти учетные записи. Используйте подзапрос с GROUP BY userid
, чтобы получить max(created_at)
для каждого пользователя. INNER JOIN
, которые приводят к счетам и фильтруют WHERE status = 'CANCELLED'
. Используйте EXISTS
, чтобы проверить, имел ли этот пользователь когда-либо учетную запись 'ACTIVE'
. Присоединитесь снова, чтобы получить все учетные записи для таких пользователей.
SELECT *
FROM account a1
INNER JOIN (SELECT a2.userid
FROM account a2
INNER JOIN (SELECT a3.user_id,
max(a3.created_at) created_at
FROM account a3
GROUP BY a3.userid) a4
ON a4.userid = a2.user_id
AND a4.created_at = a3.created_at
WHERE a1.status = 'CANCELLED'
AND EXISTS (SELECT *
FROM account a5
WHERE a5.userid = a1.userid
AND a5.status = 'ACTIVE')) a6
ON a6.userid = a1.userid;