我有这张桌子。
ID Date Value
___ ____ _____
3241 01/01/00 15456
3241 9/17/12 5
3241 9/16/12 100
3241 9/15/12 20
4355 01/01/00 01
4355 9/16/12 12
4355 9/15/12 132
4355 9/14/12 4
1001 01/01/00 456
1001 9/16/12 125
5555 01/01/00 01
1234 01/01/00 01
1234 9/16/12 45
2236 01/01/00 879
2236 9/15/12 128
2236 9/14/12 323
2002 01/01/00 567
我想,select
所有记录01-01-00 as date
并且只显示过一次。
我想要的结果如下表所示。
ID Date Value
___ ____ _____
5555 01/01/00 01
2002 01/01/00 567
我尝试使用HAVING
子句,但由于GROUP BY
,结果是 错误 ,因为我的一个选择有多个记录对我的情况不利。
我的错误尝试:
SELECT * FROM
(SELECT *
FROM table1
GROUP BY id, date, value
HAVING count(Id)=1) t1
WHERE date='01-01-00'
答案 0 :(得分:1)
我会用:
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');
这可以利用t1(date)
和t1(id, date)
上的索引。
答案 1 :(得分:0)
使用IN
SELECT *
FROM table1
WHERE id IN (
SELECT id
FROM table1
GROUP BY id
HAVING count(Id)=1
) and date='01-01-00'
答案 2 :(得分:0)
将您的查询更改为
SELECT *
FROM
(SELECT *
FROM table1
GROUP BY id
HAVING count(id)=1) t1
WHERE t1.date='01-01-00'
答案 3 :(得分:0)
我只是没有注意到我在group by
中犯了一个错误,而不只是ID
,我把所有columns
SELECT * FROM
(SELECT *
FROM Table1
GROUP BY `ID`
HAVING count(`ID`)=1) t1
WHERE `Date`='2000-01-01 00:00:00'
但是对于我的问题,我采用this solution from Gordon Linoff,因为它对我来说似乎更好。
PS:我有200万条记录。