2010-09-12 92 views
9

我有一個表,看起來像這樣:SQL如何刪除select查詢中的重複項?

alt text

正如你看到的,有一些重複的日子,所以如何選擇只有一行在表中的每個日期?

列「id_from_other_table」是內蒙古與上述

+2

什麼數據庫,什麼版本? – LittleBobbyTables 2010-09-12 15:40:37

+0

你好,託尼,當我嘗試做類似的事情時,我發現這很有用。它不回答你的問題,並刪除重複項,但它有助於給出一個可能相關的計數: COUNT(*) - COUNT(DISTINCT name)AS'重複名稱' – JPK 2016-05-04 10:27:09

回答

4

你提到有日期重複,但它看起來非常獨特,精確到秒。

你能否澄清一下你開始考慮日期的日期重複的日期,日期,小時,分鐘?

無論如何,你可能會想要floor your datetime field。您沒有指出刪除重複項時哪個字段是首選,因此此查詢將按字母順序偏好姓。

SELECT MAX(owner_name), 
     --floored to the second 
     dateadd(second,datediff(second,'2000-01-01',start_date),'2000-01-01') AS StartDate 
From MyTable 
GROUP BY dateadd(second,datediff(second,'2000-01-01',start_date),'2000-01-01') 
+0

我認爲年,月,日和hh:mm:ss – Tony 2010-09-12 15:48:50

4

表連接你需要除了日期的任何其他信息?如果不是:

SELECT DISTINCT start_date FROM table; 
+2

日期相同,但時間不同;因此,如果沒有格式化,'DISTINCT'將無法在'start_date'上工作 – LittleBobbyTables 2010-09-12 15:39:55

10

有多行具有相同的日期,但時間不同。因此,DISTINCT start_date將不起作用。你需要的是:投的起始日期爲DATE(所以時間部分消失了),然後做一個DISTINCT:

SELECT DISTINCT CAST(start_date AS DATE) FROM table; 

取決於你用什麼數據庫,爲DATE類型名稱是不同的。

1
Select Distinct CAST(FLOOR(CAST(start_date AS FLOAT))AS DATETIME) from Table 
0

如果您想選擇特定的一天任何隨機單列,然後

SELECT * FROM table_name GROUP BY DAY(start_date) 

如果您想選擇每天每個用戶一個條目,然後

SELECT * FROM table_name GROUP BY DAY(start_date),owner_name 
1

這裏是解決方案爲您的查詢返回該表中的每個日期只有一行 這裏的解決方案'tony'會出現兩次,因爲它有兩個不同的開始日期。

SELECT * FROM 
(
    SELECT T1.*, ROW_NUMBER() OVER(PARTITION BY TRUNC(START_DATE),OWNER_NAME ORDER BY 1,2 DESC) RNM 
    FROM TABLE T1 
) 
WHERE RNM=1 
+0

hi @zessx您如何編輯它,我在編輯時放置了格式化的代碼,但發佈後,它沒有像現在這樣出現,你怎麼做? – 2014-10-27 06:32:06

+1

粘貼格式化的代碼是不夠的(事實上,它什麼都不做)。你需要粘貼你的代碼,選擇它並使用Ctrl + K(或者點擊StackOverflow編輯器中的「{}」按鈕)。您也可以手動完成,在代碼的每一行之前添加4個空格。 – zessx 2014-10-27 06:56:18

0

您必須將「DateTime」轉換爲「Date」。那麼無論該日期的時間如何,您都可以更輕鬆地爲給定日期選擇一個。