powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Удаление ненужных записей...
12 сообщений из 12, страница 1 из 1
Удаление ненужных записей...
    #32069440
Alexis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день всем!
Сразу к вопросу:
Есть таблица со следующими полями:
ID - номер п/п,
Date_Year - дата ремонта,
Type - тип ремонта.
Так вот при расчете очередного ремонта, вносятся данные в эту таблицу. Ремонты могут быть трех видов К- капитальный, С- средний, Т- текущий. Каждый тип ремонта рассчитывается по своему правилу, после того как все ремонты посчитаны нужно выполнить следущую т.н. "чистку":
Приоритет ремонтов (по убыванию): К (самый важный); С (менее важный); Т (выполняется если нет среднего или капитального).
Следовательно, проверяем если все три ремонта выпали в один месяц, то нужно оставить только Капитальный.
Если в одном месяце есть только Капитальный и Средний, то опять оставляем Капитальный.
А в случае "попадания" в один месяц Среднего и Текущего, оставляем Средний.
Остальные записи должны быть удалены...
Т.е. в месяц фактически выполняется только какой-либо один ремонт.
Как это сделать в одном запросе?
...
Рейтинг: 0 / 0
Удаление ненужных записей...
    #32069454
evg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
evg
Гость
Используй поле тип (раз уж так все хорошо сложилось) - ищи минимальное значение min(type) c необходимым уровнем группировки. А дальше удаляй.
...
Рейтинг: 0 / 0
Удаление ненужных записей...
    #32069472
dao
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С помощью подзапроса - выбираешь те которые надо оставить и удаляешь те которые не входят в подзапрос
примерно так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
create #t (id,Type)

insert into #t (id,Type)
select  id,min(Type) from table where 
group by id 

delete from table where id not in (select id from #t)

Вот так примерно
...
Рейтинг: 0 / 0
Удаление ненужных записей...
    #32069478
Фотография mahoune
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
DELETE FROM table
WHERE id in (
select id from table where 
group by id 
);


А так не получится! Или это не првильно?!
...
Рейтинг: 0 / 0
Удаление ненужных записей...
    #32069521
Flint-San
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно сказать с Type повезло так как
select ascii('К'),ascii('С'),ascii('Т') значения будут по нарастающей

отсюда, сохраняем таблицу
select
DatePart(year,Date_Year) as y,
DatePart(month,Date_Year) as m,
char( min( ascii(Type) )) as t
into #YearMonth
from
[ремонты]
group by DatePart(year,Date_Year), DatePart(month,Date_Year)
затем находим максимальный ID, а не сразу как советуют DAO
select
m,y,
max([ремонты].id) as maxid
into #save
from
[ремонты],
#YearMonth
where
DatePart(year,Date_Year) = y and DatePart(month,Date_Year) = m and Type=t
group by m,y
и теперь имея нужнуй ID удаляем лишние записи
delete from [ремонты]
where
not exists(select s.maxid from #save as s where s.maxid=[ремонты].id)
вот тока в один запрос не вышло, а надо?
...
Рейтинг: 0 / 0
Удаление ненужных записей...
    #32069536
Alexis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
То: Flint-San.
В первом запросе пропустил выбор поля ID для добалвения во временную таблицу #YearMonth.
А так вроде то, что нужно....
...
Рейтинг: 0 / 0
Удаление ненужных записей...
    #32069540
Flint-San
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alexis ничего я не пропустил! Смотри код внимательней!
вот тебе начало тестового кода
create table [ремонты]
(
ID int Identity(1,1) PRIMARY KEY,
Date_Year smalldatetime,
Type char(1) CHECK( Type Like 'К' or Type Like 'С' or Type Like 'Т')
)
go


insert into [ремонты](Date_Year,Type) values('01.01.2002','Т')
insert into [ремонты](Date_Year,Type) values('01.01.2002 08:00','С')
insert into [ремонты](Date_Year,Type) values('01.02.2002','К')
insert into [ремонты](Date_Year,Type) values('01.03.2002','К')

insert into [ремонты](Date_Year,Type) values('02.01.2002','Т')
insert into [ремонты](Date_Year,Type) values('02.01.2002 08:00','С')

insert into [ремонты](Date_Year,Type) values('03.01.2002','Т')
go
...
Рейтинг: 0 / 0
Удаление ненужных записей...
    #32069565
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
select ID,Date_Year,max(ascii(Type ))
from table
group by ID,Date_Year
...
Рейтинг: 0 / 0
Удаление ненужных записей...
    #32069578
Flint-San
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alexis дай плиз код создания своей таблицы + 10 последовательных записей в ней
MiCe и чего добьешься ты своим кодом?
Из задачи:

Следовательно, проверяем если все три ремонта выпали в один месяц, то нужно оставить только Капитальный.
Если в одном месяце есть только Капитальный и Средний, то опять оставляем Капитальный.
А в случае "попадания" в один месяц Среднего и Текущего, оставляем Средний.

То есть я так понимаю, что в начале клиент внес информацию что у него идет просто ремонт 'Т', через 8часов он соображает что уже началась новая смена а у него все ремонт и добавил запись что ремонт у него 'С'
а на следущий день бригадой порешили что пора переходить на Капитальный. Вот еще и не забудем что это может быть и этом и впрошлом году. Я прав Alexis?
...
Рейтинг: 0 / 0
Удаление ненужных записей...
    #32069587
Alexis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Thanks a lot MiCe.
Your query is the most approach and rather effective.
...
Рейтинг: 0 / 0
Удаление ненужных записей...
    #32069591
Alexis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нет Flint-San, немного не то.
Дело в том, что эти ремонты - это план на год.
И рассчитываются они тоже на год.
Каждая единица оборудования (прибор) может быть отремонтирован в соответствии с нормативами. Я уже просчитал, теперь в таблице есть даты ремонтов на год. И мне нужно было просто провести "чистку", т.е. удалить только те, в которых в один месяц было несколько ремонтов и оставить высший по приоритету. Т.е. группировка нужна по ID и по типу...
...
Рейтинг: 0 / 0
Удаление ненужных записей...
    #32069853
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вообще то группировка тут совсем не нужна, надо просто удалить такие записи за каждый месяц, у которых есть аналогичные с более высоким приоритетом
Код: plaintext
1.
2.
delete n from tbl n, tbl v 
 where year(n.Date_Year)= year(v.Date_Year) and  month(n.Date_Year)= month(v.Date_Year) and v.Type > n.Type 
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Удаление ненужных записей...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]