Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.09.2016, 13:42   #1
norrow
Новичок
Джуниор
 
Регистрация: 16.09.2016
Сообщений: 4
По умолчанию Сравнение элементов в одной таблице

Добрый день!

Начну с того, что я полный нуб в sql, ничего сложнее SELECT something FROM table WHERE something = 'something' никогда не делал, потому, что не было нужны, а теперь нужда есть.

Подскажите пожалуйста хотя бы, в какую сторону смотреть.

Есть таблица вида:
Код:
Assetnum   Date			Reading	ID		Reason
N028454	28.02.2016 17:33:24	310870	73286	Плановое ТО
N028454	28.02.2016 17:33:24	123341	73288	Ремонт
N027544	28.02.2016 17:33:36		0	73290	Плановое ТО
N027544	28.02.2016 17:33:36		0	73292	Плановое ТО
N028563	28.02.2016 17:34:36	135065	73294	Плановое ТО
N028563	28.02.2016 17:34:36	137654	73296	Ремонт
N028563	28.02.2016 17:34:36	140685	73298	Плановое ТО
N028576	28.02.2016 17:34:38	194780	73300	Плановое ТО
N028576	28.02.2016 17:34:38	195765	73302	Плановое ТО
Необходимо для всех элементов с одинаковыми полями ASSETNUM и REASON, найти самый последний (наибольшие ID и DATE), сравнить READING с с предыдущими (второй по величине ID и DATE) и записать разность в новую колонку.

Честно говоря, я вообще не представляю даже с чего начать, помогите советом.

Последний раз редактировалось Serge_Bliznykov; 16.09.2016 в 13:53.
norrow вне форума Ответить с цитированием
Старый 16.09.2016, 13:58   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

запрос у Вас весьма непростой.
SQL очень не "любит" таких понятий, как предыдущее значение, следующее значение..

Ну и есть ряд вопросов по логике.

Цитата:
наибольшие ID и DATE
почему по двум полям? ID - что - не уникальное поле (ключевой идентификатор)?!
Если нет, то какое поле в таблице является ключевым?
если дата максимальная, а ID - нет - это запись самая последняя или нет?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 16.09.2016, 14:06   #3
norrow
Новичок
Джуниор
 
Регистрация: 16.09.2016
Сообщений: 4
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение

почему по двум полям? ID - что - не уникальное поле (ключевой идентификатор)?!
Если нет, то какое поле в таблице является ключевым?
если дата максимальная, а ID - нет - это запись самая последняя или нет?

Ваша правда, ID вполне достаточно.
norrow вне форума Ответить с цитированием
Старый 16.09.2016, 14:12   #4
predefined
Форумчанин
 
Регистрация: 01.08.2016
Сообщений: 182
По умолчанию

Группировка по ASSETNUM и REASON, потом сортировка по убыванию ID и DATE (определиться что из них первичнее с учётом комментария Serge_Bliznykov).
Тогда первая строка выборки будет содержать значение МАКС, вторая - ПРЕД.

Самое интересное будет "записать разность в новую колонку" - в строку где МАКС или в строку где ПРЕД? Или в какую-то третью?
По идее, писать "разницу" есть смысл в отдельную таблицу(или просто выводить результаты в ваше приложение), иначе нарушается логичность данных в таблице. Сотрёте потом строку или измените в ней данные - и ваша колонка с результатами "разницы" потеряет смысл. Или её надо будет постоянно пересчитывать при любом действии с таблицей.

Вам всё это надо проделать только на SQL одним запросом, или промежуточные данные можно посылать в приложение, которое потом сделает второй запрос?

Последний раз редактировалось predefined; 16.09.2016 в 14:23.
predefined вне форума Ответить с цитированием
Старый 16.09.2016, 14:15   #5
norrow
Новичок
Джуниор
 
Регистрация: 16.09.2016
Сообщений: 4
По умолчанию

Цитата:
Сообщение от predefined Посмотреть сообщение
Группировка по ASSETNUM и REASON, потом сортировка по убыванию ID и DATE (определиться что из них первичнее с учётом комментария Serge_Bliznykov).

Вам всё это надо проделать только на SQL одним запросом, или промежуточные данные можно посылать в приложение, которое потом сделает второй запрос?
К сожалению - на чистом SQL
Да, ID безусловно важнее, у меня просто немного шарики за ролики заехали.
norrow вне форума Ответить с цитированием
Старый 16.09.2016, 14:30   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

На счет записать в новую колонку не понял, а вот запросом выдать с этой вычисляемой колонкой можно примерно так
Код:
SELECT T.*,
    CASE WHEN U.MaxID IS NULL THEN NULL
         ELSE U.Reading - (SELECT TOP 1 V.Reading FROM MyTable V WHERE V.ASSETNUM=U.ASSETNUM AND V.REASON=U.REASON AND V.ID<U.MaxID ORDER BY V.ID DESC)
    END AS [Разница]
  FROM MyTable T
    LEFT JOIN (SELECT ASSETNUM,REASON,MAX(ID) AS MaxID FROM MyTable GROUP BY ASSETNUM,REASON) U ON U.ASSETNUM=T.ASSETNUM AND U.REASON=T.REASON AND T.ID=U.MaxID
Это для MS SQL и на коленке, так что если ошибся не обессудь. Да, и возможны проблемы, если ID в группе с одинаковыми ASSETNUM и REASON не уникально
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 16.09.2016 в 14:33.
Аватар вне форума Ответить с цитированием
Старый 16.09.2016, 14:32   #7
norrow
Новичок
Джуниор
 
Регистрация: 16.09.2016
Сообщений: 4
По умолчанию

Цитата:
Сообщение от predefined Посмотреть сообщение
Самое интересное будет "записать разность в новую колонку" - в строку где МАКС или в строку где ПРЕД? Или в какую-то третью?
В таблице есть колонка DELTA, заполнена нулями, вот туда вот.
norrow вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сравнение всех значений поля в одной таблице со значением одного поля в другой ZulenkaSun Помощь студентам 3 07.06.2016 15:10
Сравнение ячеек в таблице и подсчет совпадений elusiren Microsoft Office Excel 1 21.04.2015 12:10
2 автофильтра в одной таблице agregator Microsoft Office Excel 3 18.09.2012 22:59
графики в одной таблице Litty Microsoft Office Excel 6 29.04.2009 22:49
сравнение с данными в таблице Apo БД в Delphi 5 31.03.2008 19:24