在特定日期之前查询无值

Posted

技术标签:

【中文标题】在特定日期之前查询无值【英文标题】:Query without value before certain date 【发布时间】:2015-03-04 16:19:56 【问题描述】:

我正在接受数据库管理方面的培训,这是我第一次发帖,如果我在发帖时没有遵循标准程序,我深表歉意。我已经搜索过,但找不到答案。

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

我知道这只会显示 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

【问题讨论】:

您的查询并未披露每列的来源。请提供表定义(您在 psql 中使用 \d tbl 获得的内容),或至少在查询中提供表限定列。使用表别名来保持它的可读性。请总是声明你的 Postgres 版本。 【参考方案1】:

在您发布的查询中,添加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
   );

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

【讨论】:

EXISTS 和 NOT EXISTS 是我一直在寻找的,但找不到任何语言。到目前为止,我才真正这样做了大约 2 周。我只是更改了它以反映我们的表以及我需要的列和计数,然后过滤掉 2012 年 4 月 27 日,这是许多客户大规模迁移到数据库的日期。谢谢! 实际上,当我添加 COUNT 函数时,它只返回 1 个值。我需要能够计算他们在 2014 年下的所有订单。我刚刚得到一个大列,全是 1。 我想我修好了。我加入了 cohead 表,因为它正在提取在 custinfo 表中没有重复的 cust_name 值。现在它正在加入 cohead 中出现在订单上的所有相同名称,因此它正在计算每个订单。再次感谢您的帮助! @MichaelWilkey:你的问题在几个方面有点含糊。精确问题的精确答案... 对不起,就像我说的,第一次发帖。不确定是否适合在长篇文章中详细介绍情况。但是你给了我解决这个问题所需的确切信息。谢谢!

以上是关于在特定日期之前查询无值的主要内容,如果未能解决你的问题,请参考以下文章

围绕特定日期但年份不断变化的访问查询[关闭]

从日期中选择特定记录的 SQL 查询

在特定日期之后获取唯一 ID 的 SQL 查询

如何编写选择最后一个特定日期并从那里返回 1 周的查询?

查找每个 ID 的特定日期之前的最大日期和特定日期之后的最小日期 [关闭]

Mysql Query:从特定日期识别可用车辆