mysql — удаление всех записей, кроме самой последней, из одной таблицы SQL
спросил
Изменено 7 лет, 5 месяцев назад
Просмотрено 262 раза
У меня есть одна таблица SQL, которая содержит несколько записей для каждого идентификатора клиента (у некоторых идентификаторов клиентов есть только одна запись, которую я хочу сохранить). Мне нужно удалить все, кроме самой последней записи для каждого идентификатора клиента, используя поле invoiceDate в качестве маркера.
Итак, мне нужно перейти от этого:
+------------+-------------+---------- -+ | идентификатор клиента | Дата счета-фактуры | ID счета | +------------+--------------+------------+ | 1 | 1393995600 | хх | | 1 | 1373688000 | хх | | 1 | 1365220800 | хх | | 2 | 1265220800 | хх | | 2 | 1173688000 | хх | | 3 | 1325330800 | хх | +------------+--------------+------------+
К этому:
+------------+-------------+-----------+ | идентификатор клиента | Дата счета-фактуры | ID счета | +------------+--------------+------------+ | 1 | 1393995600 | хх | | 2 | 1265220800 | хх | | 3 | 1325330800 | хх | +------------+--------------+------------+
Будем признательны за любые рекомендации!
- MySQL
- SQL
3
- Напишите запрос, чтобы выбрать все строки, которые вы хотите удалить:
ВЫБРАТЬ * ИЗ т ГДЕ накладнаяДата НЕ В ( ВЫБЕРИТЕ МАКС(дата счета) -- "FROM t AS t2" не поддерживается MySQL, см. http://stackoverflow.com/a/14302701/227576. ИЗ (ВЫБРАТЬ * ИЗ t) КАК t2 ГДЕ t2.customerId = t.customerId СГРУППИРОВАТЬ ПО t2.customerId )
Для большой базы данных это может занять много времени.
- Если вы удовлетворены, измените запрос на оператор DELETE:
УДАЛИТЬ ИЗ t ГДЕ накладнаяДата НЕ В ( ВЫБЕРИТЕ МАКС(дата счета) -- "FROM t AS t2" не поддерживается MySQL, см. http://stackoverflow.com/a/14302701/227576. ИЗ (ВЫБРАТЬ * ИЗ t) КАК t2 ГДЕ t2.customerId = t.customerId СГРУППИРОВАТЬ ПО t2.customerId )
См. http://sqlfiddle.com/#!9/6e031/1
Если у вас есть несколько строк, дата которых является самой последней для одного и того же клиента, вам придется искать дубликаты и решать, какой из них вы хотите держать себя. Например, посмотрите на customerId 2 в приведенной выше ссылке скрипта SQL.
2
Попробуйте этот
с todelete как ( выбирать CustomerId, InvoiceId, InvoiceDate, Row_Number() over (раздел по заказу CustomerId по описанию InvoiceDate) как Count из УдалитьДубликат ) удалить из toудалить где количество > 1
Предположим, что имя таблицы transaction_table
.
создать таблицу test1 AS выберите из ( выберите * из таблицы транзакций по заказу по идентификатору клиента, invoiceDate desc) temp группировка по идентификатору клиента
У вас будут выходные данные в таблице test1
.
1
удалить из ex_4 где рядок в (выберите идентификатор строки от ex_4 а где to_date(invoicedate,'DDMMYYYY') = (выберите max(to_date(invoicedate,'DDMMYYYY')) из ex_4 b где a.customerid != b.customerid))
Вот как это будет сделано в oracle. Этот запрос удалит все, кроме самой последней добавленной строки. Глядя на структуру вашей таблицы, я предполагаю, что столбец invoicedate имеет тип varchar2, поэтому преобразование его в дату использовало функцию to_date здесь
Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью GoogleЗарегистрироваться через Facebook
Зарегистрируйтесь, используя адрес электронной почты и пароль
Опубликовать как гость
Электронная почта
Требуется, но не отображается
Опубликовать как гость
Электронная почта
Требуется, но не отображается
Virat Kohli Дебют и последние сыгранные матчи в форматах Tests, ODI, T20I и других
Virat Kohli Дебют и последние сыгранные матчи в форматах Tests, ODI, T20I и других форматахМатчи (18)
WT20 WC (3)
UAE v АФГ (1)
PSL 2023 (3)
IND v AUS (1)
NZ v ENG (1)
Ranji Trophy (1)
ENG-U19 в Австралии (1)
NSL 4-90 Day (05)
CWC League 2 (1)
CSA 4-дневный Div1 (4)
Результат • Только молодежь T20I • Brisbane
ENG19
(20/20 OV) 158/8
AUS19
(17. 1/ 20 ov, T:159) 162/0
Aust U19 выиграла с разницей в 10 калиток (осталось 17 мячей)
РасписаниеСерия
RESULT • 9th Match • NSL 4-Day • FC • Hambantota
DAM
341 & 401
COLBO
(T:486) 257 & 110/3
Match drawn
ScheduleTableSeries
RESULT • 10th Match • NSL 4-Day • FC • Galle
JFNA
130 & 584/9d
GALLE
(T:457) 258 & 50/3
Match Drawn
MadeLetableseries
Сегодня, 14:00 • 9 -й матч • PSL 2023 • T20 • Karachi
Quetta Gladiators
Peshawar Zalmi
Match еще не начался
Prediculetableseries
Not Copt Live CSA, 4 дня, DIV1 • FC • Potchefstroom
NWEST
WPR
null
ScheduleTableSeries
Не покрывается Live • 18-й матч • CSA 4-Day DIV1 90• 2 FC IT • 0 Pretoria 00005
BOL
null
ScheduleTableSeries
India|Top order Batter
INTL CAREER: 2008 — 2023
Most viewed players
- Ravindra Jadeja
- Srikar Bharat
- Ravichandran Ashwin
- Virat Kohli
- Cheteshwar Pujara
- Рохит Шарма
- КЛ Рахул
- Аксар Патель
- Арпит Васавада
- Сачин Тендулкар
Дополнительные ссылки
- Contracted Players
- Test Caps
- ODI Caps
- T20I Caps
- WTEST Caps
- WODI Caps
- WT20I Caps
Browse other players
Bangladesh
- Afif Hossain
- Литтон Дас
- Мехиди Хасан Мираз
- Мосаддек Хоссейн
- Мустафизур Рахман
- Наджмул Хоссейн Шанто
- Нурул Хасан
- Shakib Al Hasan
- Shoriful Islam
- Taskin Ahmed
Alphabetically sorted top ten of players who have played the most matches across formats in the last 12 months
Overview
Stats
Records
Matches
Videos
Новости
Фотографии
Дебют/последние матчи — Игрок
Тестовые матчи
Просмотр протоколов тестов
Дебют
Вест-Индия против Индии в Кингстоне — 20-23 июня 2011 г. 0005
Последний
Индия против Австралии в Дели — 17 — 19 февраля, 2023
Matches ODI
View ODI Records
Дебют
Шри -Ланка против Индии в Дамбалле — 18 августа 2008 г.
Последняя
Индия против Индии по сравнению с Дамбаллой — 18 августа
Новая Зеландия в Индоре — 24 января 2023 г.
T20I Матчи
View T20I Records
Дебют
Зимбабве против Индии в Хараре — 12 июня 2010 г.
Последний
Индия против Англии в Аделеиде — 10 ноября, 2022
Индия против Англии.0005
Matches FC
Дебют
Тамилнаду против Дели в Дели — 23 — 26 ноября 2006 г.
Последний
Индия против Австралии в Дели — 17 — 19000
Дебют
Delhi vs Services в Дели — 18 февраля 2006 г.
Последний
Индия против Новой Зеландии в Индоре — 24 января 2023 г.
T20 Матчи
Дебют
Delhi Vs Himachal At Delhi — Apry.