2015-12-02 149 views
1

需要從下表中誰沒有時間,在十一月獲得這些IDS 2015年如何避免重複的列值

表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 

我可以理解,它以重複的ID的條目在表中。 我需要避免這種情況。
請幫忙編寫查詢獲取輸出爲「樣本輸出」。

非常感謝您的任何建議。

回答

0
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月的時間。

0

您的查詢選擇不在11月份的行,然後顯示它們具有的不同id_no。如果你想只檢索沒有在十一月發生的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) 
0

所做的DISTINCT語句是正確的,以防止重複。我個人更喜歡使用GROUP BY,但都是可能的。

to_char函數我不會用於選擇,因爲數據庫必須將此函數應用於每條記錄,才能開始過濾。範圍選擇如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可以更容易地成功使用索引。 (由Mureinik's答案啓發):

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' 
) 
0

SQL Fiddle

的MySQL 5。6架構設置

CREATE TABLE TABLE_NAME AS 
      SELECT 'S12' as id_no, DATE '2010-06-02' AS time_in 
UNION ALL SELECT 'S12', DATE '2010-10-07' 
UNION ALL SELECT 'S12', DATE '2011-02-23' 
UNION ALL SELECT 'S12', DATE '2014-02-01' 
UNION ALL SELECT 'S12', DATE '2015-11-26' 
UNION ALL SELECT 'S68', DATE '2006-03-15' 
UNION ALL SELECT 'S80', DATE '2009-10-28' 
UNION ALL SELECT 'S80', DATE '2010-10-07' 
UNION ALL SELECT 'S80', DATE '2011-02-23'; 

查詢1

SELECT id_no 
FROM table_name 
GROUP BY id_no 
HAVING COUNT(CASE WHEN DATE_FORMAT(time_in, '%Y-%m-01') = DATE '2015-11-01' THEN 1 END) = 0 

Results

| id_no | 
|-------| 
| S68 | 
| S80 |