繁体   English   中英

SQL在所有早于x的日期中查找最高日期

[英]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 joingroup byhaving

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM