需要从下表中获得那些没有时间进入2015年11月的身份证。
表1:
id_no time-in
S12 02-JUL-10 08.00.00
S12 07-OCT-10 10.00.00
S12 23-FEB-11 08.00.00
S12 01-FEB-14 09.00.00
S12 26-NOV-15 00.00.00
S68 15-MAR-06 08.00.00
S80 28-OCT-09 08.00.00
S80 07-OCT-10 10.00.00
S80 23-FEB-11 08.00.00样本输出
id_no
s68
s80我不知道如何写上面的查询。我试过下面的方法
SELECT DISTINCT ID_NO FROM TABLE1
WHERE TO_CHAR(TIME_IN, 'YYYYMM') not in('201511');我得到的输出
id_no
s12
s68
s80我可以理解它接受表中重复的in条目。我要避免那样做。
请帮助编写将输出作为“示例输出”的查询。
非常感谢您的建议。
发布于 2015-12-02 08:20:44
SELECT DISTINCT ID_NO FROM TABLE1 WHERE TO_CHAR(TIME_IN, 'YYYYMM') <> ('201511')
MINUS
SELECT DISTINCT ID_NO FROM TABLE1 WHERE TO_CHAR(TIME_IN, 'YYYYMM') = '201511';上述查询将放弃s12,因为它在2015年11月有时间。
发布于 2015-12-02 08:21:49
您的查询选择未在11月份的行,然后显示它们所具有的不同的id_no。如果您只想检索11月没有发生的ID,exists操作符可以帮助您:
SELECT DISTINCT id_no
FROM table1 t1
WHERE NOT EXISTS (SELECT *
FROM table1 t2
WHERE TO_CHAR(t2.time_in, 'YYYYMM') = '201511' AND
t1.id_no = t2.id_no)发布于 2015-12-02 09:53:09
您所做的区分语句是正确的,以防止重复。就我个人而言,我更喜欢使用GROUP BY,但两者都是可能的。
我不会使用to_char函数来选择on,因为DB必须将该函数应用于每个记录,然后才能开始筛选。像BETWEEN或>= AND <=这样的范围选择通常更快、更清晰。
有两种选择:
1)清洁和简单:由id_no组成的组,统计2015年11月所有站点出现的情况,并且只返回那些数量为0的站点。
SELECT t1.id_no
FROM table1 AS t1
GROUP BY id_no
HAVING SUM(IF(t1.time-in BETWEEN '2015-11-01'AND '2015-12-01', 1, 0)) = 0;2)带有子查询。我可以想象,对于MySQL来说,成功地使用这个索引会更容易。(受莫里尼克氏答案启发):
SELECT DISTINCT t1.id_no
FROM table1 AS t1
WHERE id_no NOT IN (
SELECT DISTINCT id_no
FROM table1 AS t2
WHERE t2.time-in BETWEEN '2015-11-01' AND '2015-12-01'
)https://stackoverflow.com/questions/34037745
复制相似问题