在特定日期之前查询无值
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:你的问题在几个方面有点含糊。精确问题的精确答案... 对不起,就像我说的,第一次发帖。不确定是否适合在长篇文章中详细介绍情况。但是你给了我解决这个问题所需的确切信息。谢谢!以上是关于在特定日期之前查询无值的主要内容,如果未能解决你的问题,请参考以下文章