2016-09-15 2 views
0

У меня есть таблица со следующими столбцами ... Node, дата_время, рынок, ценаSQL Устранение дубликатов с NO ID

Я хотел бы, чтобы удалить все, кроме 1 записи для каждого узла, дата времени.

SELECT Node, Date_Time, MAX(Price) 
FROM Hourly_Data 
Group BY Node, Date_Time 

Это результаты, которые я хотел бы видеть, но не могу понять, как удалить другие записи.

Примечание - Там нет ID для этой таблицы

+3

Какая СУБД вы используете? Ответы будут различаться в зависимости от поставщика базы данных. –

+1

Показать схему таблицы – scaisEdge

ответ

0

вот простой метод sql-server, который создает номер строки внутри cte и удаляет из него. Я считаю, что этот метод также работает для большинства СУБД, которые поддерживают функции окна и общие выражения таблицы.

;WITH cte AS (
    SELECT 
     * 
     ,RowNum = ROW_NUMBER() OVER (PARTITION BY Node, Date_Time ORDER BY Price DESC) 
    FROM 
     Hourly_Data 
) 

DELETE 
FROM 
    cte 
WHERE 
    RowNum > 1 
+0

Спасибо, что нумерация строк была именно то, что мне нужно. Просто протестировал его на тестовой таблице и начал запускать ее в полной таблице –

+0

, рад помочь, в будущем, если вы можете пометить свои вопросы сервером базы данных, который вы используете, например. sql-server, oracle и т. д. вы получите более быстрые ответы от большего количества людей. Приветствия. – Matt

1

Вот шаги, которые скорее как обойти это ограничение, чем просто одна команда, которая будет работать в любой реляционной базе данных:

  1. Создать новую таблицу, которая выглядит просто как один у вас уже есть
  2. Вставьте данные, вычисленные вашей группа-по запросу вновь созданной таблице
  3. отброшенных старая таблица
  4. Переименовать новую таблицу в т он назвал старый, который имел обыкновение иметь

Просто помните, что блокировка имеет место, и для выполнения этого действия вам нужно некоторое время обслуживания.

Существуют более простые способы достижения этого, но они специфичны для СУБД.

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