Sql 选择所有具有特定日期且仅记录过一次的用户
我有这张桌子 我想选择所有以01-01-00为日期且仅显示一次的记录。 我想要得到的结果如下表所示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
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'