sql - 在特定日期之前查询没有值

标签 sql database postgresql date exists

我正在接受数据库管理方面的培训,这是我的第一篇文章,所以如果我没有遵循标准的发布过程,我深表歉意。我进行了搜索,但找不到答案。

在 PostgreSQL 中,我试图查找 2014 年的所有新客户订单。但有些客户可能已在 2013 年或 2012 年添加,但直到 2014 年才下订单。所以我试图查询客户在哪里在 1/1/2014 之前没有订单,或者换句话说,他们的第一个订单是在 12/31/2013 之后。

我知道这只显示 2014 年添加的新客户,我只需要以某种方式获取之前添加的客户。

SELECT DISTINCT cust_name, COUNT (cust_name)
FROM cohead
JOIN custinfo
ON cust_id=cohead_cust_id
WHERE cust_dateadded >='1/1/2014' AND cust_dateadded <='12/31/2014'
AND cohead_orderdate >='1/1/2014' AND cohead_orderdate <='12/31/2014'
GROUP BY cust_name
ORDER BY cust_name

最佳答案

在您发布的查询中,添加 DISTINCT 毫无意义,因为您已经有了 GROUP BY cust_name

但我建议采用一种可能更快的完全不同的方法。
这将检索在 2014 年首次下订单的所有客户 - 无论他们何时被添加到 custinfo 表中:

SELECT *
FROM   custinfo cu
WHERE  EXISTS (  -- with order in 2014
   SELECT 1 FROM cohead
   WHERE  cohead_cust_id = cu.cust_id  -- guessing
   AND    cohead_orderdate BETWEEN '2014-01-01' AND '2014-12-31'
   )
AND    NOT EXISTS (  -- but no order before 2014
   SELECT 1 FROM cohead
   WHERE  cohead_cust_id = cu.cust_id
   AND    cohead_orderdate < '2014-01-01'  -- assuming a date column
   );

对于大表一定要有索引来支持这个查询。

关于sql - 在特定日期之前查询没有值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28859481/

相关文章:

MySQL 对文本和数字进行自然排序

sql按列最大值划分列

MySQL按小时获取记录数,即使是没有记录的小时

mysql - 多个关键字搜索的反向索引

php - 保持简单还是使用数据库作为照片库?

ruby-on-rails - rails 4 在 postgres 的多个列上选择不同的位置和限制

MySQL:如何在查询中向日期时间字段添加一天

sql - 不兼容的类型 : numeric and bigint. 在 PostgreSQL 中

.net - 我想将 PostgreSQL 与 .NET 一起使用。我该怎么做?

Postgresql:在 set-returning plpgsql 函数中选择数组的问题