查找仅在给定日期之前的记录(SQL)
我尝试了多个查询,但都不起作用。 这可能真的很简单 下面是一个示例表:查找仅在给定日期之前的记录(SQL),sql,left-join,exists,outer-join,Sql,Left Join,Exists,Outer Join,我尝试了多个查询,但都不起作用。 这可能真的很简单 下面是一个示例表: ordernr debnaam debnr orddat 1 Coca-Cola 123 2019-02-07 12 Altec 456 2019-02-07 123 Coca-Cola 123 2016-01-01 1234 Brady 789 2015-03-18 因此,关键是要找到过去两年以来一直没有订购过
ordernr debnaam debnr orddat
1 Coca-Cola 123 2019-02-07
12 Altec 456 2019-02-07
123 Coca-Cola 123 2016-01-01
1234 Brady 789 2015-03-18
因此,关键是要找到过去两年以来一直没有订购过的客户debnaam。
在我的例子中,唯一的记录应该是布雷迪
我尝试了以下查询:
SELECT a.ordernr, a.debnaam, a.debnr, a.orddat
FROM orkrg as a
WHERE NOT EXISTS(SELECT b.debnr
FROM orkrg as b
WHERE a.ordernr = b.ordernr
AND b.orddat > CONVERT(date, dateadd(year,-2,getdate())))
或使用左外连接:
SELECT *
FROM (
SELECT orkrg.ordernr, orkrg.debnaam, orkrg.debnr, orkrg.orddat
FROM orkrg
WHERE orkrg.orddat < CONVERT(date, dateadd(year,-2,getdate()))
) AS a
LEFT OUTER JOIN
(
SELECT orkrg.ordernr, orkrg.debnaam, orkrg.debnr, orkrg.orddat
FROM orkrg
WHERE orkrg.orddat > CONVERT(date, dateadd(year,-2,getdate()))
) as b
ON a.ordernr = b.ordernr
谁能帮帮我吗
谢谢 您需要使用DATEDIFF过滤掉较旧的日期:
SELECT a.ordernr, a.debnaam, a.debnr, a.orddat
FROM orkrg as a
WHERE DATEDIFF(year, a.orddat, GETDATE()) > 2
AND A.debnr NOT IN (SELECT b.debnr FROM orkrg as b WHERE
DATEDIFF(year, b.orddat, GETDATE()) <= 2)
默认情况下,我使用“不存在于不存在之上”,请参阅“为什么”,这将有助于让任何人订购>2年,但必须在过去2年中没有的地方包含一个检查。@Brad good catch,为此编辑。未经测试,但概念现在应该是正确的。假设b.debnr是买家的唯一标识符。这应该有效,性能方面不确定是否存在会更快,但如果他没有大型数据库,则应该可以。您的查询不会在my db中返回任何值。您的datediff语句一定有问题我假设您的datediff语句不存在,请执行一个where>2年的查询,并在过去2年中使用not exist进行查询,以排除最近2年中已订购的数据。此外,您正在将日期转换为日期,假设删除年份,除非您需要在2年前的某一天提前几个小时进行检查,否则您不需要这样做,并且运行您正在使用的dbms需要更长的时间?CONVERT、dateadd等是特定于产品的函数。这很有效!你能解释一下SELECT 1是什么意思吗?Thanks@Jeremy它只是为查询中的每一行返回1。如果返回1,则该行存在,因此在not exists中排除该行。您也可以使用select*或选择某个_列,但1是确定行是否存在所需的全部数据。
SELECT a.ordernr, a.debnaam, a.debnr, a.orddat
FROM orkrg as a
WHERE DATEDIFF(year, a.orddat, GETDATE()) > 2
AND A.debnr NOT IN (SELECT b.debnr FROM orkrg as b WHERE
DATEDIFF(year, b.orddat, GETDATE()) <= 2)
select a.*
from orkrg as a
where a.orddat < dateadd(year,-2,getdate()) -- this is kinda not needed
and not exists (select 1 -- NOT EXISTS is a safer option than NOT IN, where a null result can cause issues
from orkrg as b
where a.debnaam = b.debnaam and
b.orddat > dateadd(year,-2,getdate()))
select *
from orders as o
where o.debnr not in (select debnr
from orders as u
where orddat > CONVERT(date, dateadd(year,-2,getdate())))