[英]SQL find highest date in all entries with a date older than x
我尝试获取我公司去年没有任何任务的所有客户的列表。
SELECT MAX(assignment_date), full_name
FROM assignments
CROSS JOIN customers
WHERE assignments.customer_id = customers.id
AND assignment_date < '2017-01-01' -- Dynamic value from backend
GROUP BY full_name
ORDER BY assignment_date DESC
这似乎并不工作,因为然而预期的,因为它只返回一些客户,我们确实有任务在该时间范围内。 我将如何实现这种功能?
试试这个代码:
SELECT MAX(assignment_date), full_name
FROM customers
where id not in (SELECT id FROM customers inner join assigments on customers.id = assignments.customer_id WHERE assignment_date > '2017-01-01' )
这将返回数据库中的所有客户,并删除所有去年有过客户的客户。 因此,您应在“ 2017-01-01”之前获得所有没有优惠的客户
使客户加入分配,其中assignments.customer_id为NULL,且assignment_date大于“ 2017-01-01”,即
SELECT MAX(assignment_date), full_name
FROM assignments
WHERE assignments.customer_id IN
(SELECT customers.id
FROM customers
LEFT JOIN assignments ON assignments.customer_id = customers.id
WHERE assignments.customer_id IS NULL
AND assignment_date > '2017-01-01')
GROUP BY full_name
ORDER BY assignment_date DESC
我建议left join
, group by
并having
:
SELECT MAX(assignment_date), full_name
FROM customers c LEFT JOIN
assignments a
ON a.customer_id = c.id
GROUP BY c.full_name
HAVING MAX(a.assignment_date) < '2017-01-01' OR
MAX(a.assignment_date) IS NULL
ORDER BY MAX(assignment_date) DESC;
似乎您想向所有客户显示他们的最后分配日期,但您希望将该列表限制为自2017年1月1日以来没有分配的客户。 这意味着对于那些从未分配过的客户,您要显示的日期将为空;对于其他客户,您将显示的日期为2017年1月1日。
因此,外部联接客户的最后日期,并仅保留该日期在2017-01-01之前的行或为null:
select c.full_name, a.max_date
from customers c
left join
(
select customer_id, max(assignment_date) as max_date
from assignments
group by customer_id
) a on a.customer_id = c.customer_id
where a.max_date < date '2017-01-01'
or a.max_date is null
order by a.max_date desc;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.