2010-09-12 5 views
9

У меня есть таблица, которая выглядит так:SQL Как удалить дубликаты в выбранном запросе?

alt text

Как вы видите, есть некоторые даты дубликаты, так как выбрать только одну строки для каждой даты в этой таблице?

колонна «id_from_other_table» от INNER JOIN с таблицей выше

+2

Какая база данных и какая версия? – LittleBobbyTables

+0

Привет, Тони, я нашел, что это полезно, когда я пытался сделать подобное. Он не отвечает на ваш вопрос и удаляет дубликаты, но он помогает подсчитать количество, которое может иметь значение: COUNT (*) - COUNT (DISTINCT name) AS 'дублирующее имя' – JPK

ответ

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

4

вам нужна любая другая информация, кроме даты ли? В противном случае:

SELECT DISTINCT start_date FROM table; 
+2

Даты те же, но разные времена; как таковой, 'DISTINCT' не будет работать на' start_date' без какого-либо форматирования – LittleBobbyTables

10

Существует несколько строк с одинаковой датой, но время различное. Поэтому DISTINCT start_date не будет работать. Что вам нужно: бросить START_DATE к DATE (так TIME часть ушла), а затем сделать 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

вот решение для вашего запроса, возвращающее только одну строку для каждой даты в этой таблице здесь, в решении «Тони» будет происходить в два раза две разные даты начала есть для него

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, как вы его отредактировали, я поместил отформатированный код, как вы отредактировали, но после публикации, он не появился, как сейчас, как это сделать? –

+1

Вложения форматированного кода недостаточно (фактически, он ничего не делает). Вам нужно вставить код, выбрать его и использовать 'Ctrl + K' (или нажать кнопку' {} 'в редакторе StackOverflow).Вы также можете сделать это вручную, добавив 4 пробела перед каждой строкой вашего кода. – zessx

0

Вы должны преобразовать «DateTime» в «Дата». Затем вы можете легко выбрать только один для данной даты независимо от времени для этой даты.

Смежные вопросы