Sql 选择所有具有特定日期且仅记录过一次的用户

Sql 选择所有具有特定日期且仅记录过一次的用户,sql,teradata,Sql,Teradata,我有这张桌子 我想选择所有以01-01-00为日期且仅显示一次的记录。 我想要得到的结果如下表所示 ID Date Value ___ ____ _____ 5555 01/01/00 01 2002 01/01/00 567 我尝试使用HAVING子句,但由于GROUP BY,结果是错误的,因为我的一个select有多个记录,这对我的情况不好 我的错误尝试: SELECT * FROM (SELECT * F

我有这张桌子

我想选择所有以01-01-00为日期且仅显示一次的记录。 我想要得到的结果如下表所示


ID       Date       Value 
___      ____       _____
5555     01/01/00   01
2002     01/01/00   567
我尝试使用HAVING子句,但由于GROUP BY,结果是错误的,因为我的一个select有多个记录,这对我的情况不好

我的错误尝试:

SELECT * FROM
  (SELECT *
   FROM table1
   GROUP BY id, date, value
   HAVING count(Id)=1) t1
WHERE date='01-01-00'
用于

将您的查询更改为

SELECT * 
FROM
  (SELECT *
   FROM table1
   GROUP BY id
   HAVING count(id)=1) t1
WHERE t1.date='01-01-00'
我将使用:

select id, max(date) as date, max(value) as value
from t1
group by id
having max(date) = '01-01-00' and count(*) = 1;
更快的方法可能是:

select t1.*
from t1
where date = '01-01-00' and
      not exists (select 1 from t1 tt1 where tt1.id = t1.id and tt1.date <> '01-01-00');

这可以利用t1date和t1id,date上的索引。

我只是没有注意到我在组中犯了一个错误,我没有只做ID,而是把所有的列都放进去了

然而,对于我的问题,我采取了,因为它似乎对我更好


PS:我有200万条记录。

SELECT*with GROUP BY是一种反模式错误的SQL,在Teradata中会失败。查询1在Teradata中会失败,而在MySQL之外的任何其他DBMS中,如果选择了3504个非聚合值,则必须是关联组的一部分。您需要将MAX添加到日期和值。和2可能返回多个id和'01-01-00'组合相同但值不同的行。@dnoeth。非常感谢。真奇怪。这不是我通常犯的错误。
select id, max(date) as date, max(value) as value
from t1
group by id
having max(date) = '01-01-00' and count(*) = 1;
select t1.*
from t1
where date = '01-01-00' and
      not exists (select 1 from t1 tt1 where tt1.id = t1.id and tt1.date <> '01-01-00');
SELECT * FROM 
  (SELECT *
   FROM Table1
   GROUP BY `ID`
   HAVING count(`ID`)=1) t1
WHERE `Date`='2000-01-01 00:00:00'