powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Выборка из таблицы истории
7 сообщений из 7, страница 1 из 1
Выборка из таблицы истории
    #35563202
korda
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имеется таблица истории результатов проверки инструмента:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
KOD_INSTRUMENTA DATA_PROVERKI REZULTAT
=============== ============= ========
MOLOTOK         17/09/2007      GODEN
MOLOTOK         01/12/2007      GODEN
MOLOTOK         06/04/2008     SLOMAN
ZUBILO          14/03/2006      GODEN
ZUBILO          05/11/2007      GODEN
OTVERTKA        01/02/2008      GODEN
OTVERTKA        12/03/2008      GODEN
OTVERTKA        09/12/2008      GODEN

Таблица отсортирована по KOD_INSTRUMENTA + DATA_PROVERKI

Необходимо получить таблицу последних(текущих) результатов. (В исходной таблице они выделены красным цветом.) Т.е. по каждому из инструментов выбрать запись с максимальной датой.

Для данного примера результат получается следующий:
Код: plaintext
1.
2.
3.
4.
5.
KOD_INSTRUMENTA DATA_PROVERKI REZULTAT
=============== ============= ========
MOLOTOK         06/04/2008     SLOMAN
ZUBILO          05/11/2007      GODEN
OTVERTKA        09/12/2008      GODEN

Задача кажется тривиальной, но ума не приложу, как написать подобный запрос .
DISTINCT не получается, так как выборка происходит по одному полю (код инструмента), а в ORDER BY - два (код инструмента и дата проверки)
GROUP BY тоже не помогает, так как требуются значения ВСЕХ полей таблицы, даже, если они не ключевые (например REZULTAT)
Буду очень признателен за любую помощь.
...
Рейтинг: 0 / 0
Выборка из таблицы истории
    #35563221
Фотография ChA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какое отношение имеет вопрос к проектированию БД ? Такие вопросы надо задавать в форуме профильной СУБД. Навскидку
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT t2.*
FROM (
	SELECT
		KOD_INSTRUMENTA
		, MAX(DATA_PROVERKI) AS MaxDate
	FROM YourTbl
	GROUP BY KOD_INSTRUMENTA
) t1
INNER JOIN YourTbl t2 ON (t2.KOD_INSTRUMENTA = t1.KOD_INSTRUMENTA AND t2.DATA_PROVERKI = t1.MaxDate)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
SELECT *
FROM YourTbl t1
WHERE t1.DATA_PROVERKI IN (
	SELECT
		MAX(t2.DATA_PROVERKI)
	FROM YourTbl t2
	WHERE t2.KOD_INSTRUMENTA = t1.KOD_INSTRUMENTA
)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
SELECT *
FROM YourTbl t1
WHERE NOT EXISTS(
	SELECT *
	FROM YourTbl t2
	WHERE
		t2.KOD_INSTRUMENTA = t1.KOD_INSTRUMENTA
		AND t2.DATA_PROVERKI > t1.DATA_PROVERKI
)
Какой-нибудь, да будет работать на вашей СУБД.
...
Рейтинг: 0 / 0
Выборка из таблицы истории
    #35563303
korda
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ChA, огромное спасибо за Ваши решения!!! Я уже попробовал второй вариант (тот, который с IN) и он работает на моей СУБД.
А вопрос задал в теме "Проектирование БД" потому, что не был уверен, что подобный запрос может быть разработан в принципе. К тому-же, хотелось какого-либо стандартного решения, поддерживаемого большинством СУБД.
Ваши примеры, определённо, будут полезны и другим членам сообщества, ведь к задаче выборки текущего состояния из файла истории могут приводить различные ситуации в реальных системах.
Еще раз, большое спасибо, ChA!
...
Рейтинг: 0 / 0
Выборка из таблицы истории
    #35565713
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kordaТаблица отсортирована по KOD_INSTRUMENTA + DATA_PROVERKI
Услышав эту фразу, вменяемый преподаватель выше тройки уже не поставит.

kordaЗадача кажется тривиальной,
Да и является.

kordaА вопрос задал в теме "Проектирование БД" потому, что не был уверен, что подобный запрос может быть разработан в принципе.


kordaК тому-же, хотелось какого-либо стандартного решения, поддерживаемого большинством СУБД.
Произносите эти слова каждый раз, когда хотите, чтобы Вас перестали считать вменяемым разработчиком.
...
Рейтинг: 0 / 0
Выборка из таблицы истории
    #35566537
korda
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kordaТаблица отсортирована по KOD_INSTRUMENTA + DATA_PROVERKI
softwarerУслышав эту фразу, вменяемый преподаватель выше тройки уже не поставит.
Я бы себе и тройки не поставил. Увы, мои знания SQL более чем посредственные.

kordaЗадача кажется тривиальной,
softwarerДа и является.
Судя по тому, с какой скоростью мне ответили (ночью спросил, утром уже был ответ) и то, что найдено сразу три варианта решения, плюс Ваш комментарий, убеждает меня в том, что скорее всего так оно и есть. "Скорее всего", - потому что я могу ошибаться в своих суждениях.

kordaА вопрос задал в теме "Проектирование БД" потому, что не был уверен, что подобный запрос может быть разработан в принципе.
softwarer
Однажды к нам в класс пришла учительница химии, работавшая до этого в школе для трудных подростков. Было забавно, как уже только за знание формуы соляной кислоты можно было получить пятерку. Вобщем, уровень - понятие относительное. То, что для одного тривиально, для другого может быть просто невыполнимой задачей.

kordaК тому-же, хотелось какого-либо стандартного решения, поддерживаемого большинством СУБД.
softwarerПроизносите эти слова каждый раз, когда хотите, чтобы Вас перестали считать вменяемым разработчиком.
Если честно, я себя не считаю вменяемым разработчиком. Ну делаю программы на каком-то там уровне, ну некоторые из них работают, опять-же, на каком-то уровне. Так многие делают... Но профессионализм (под словом "вменяемость" Вы подразумеваете профессионализм, правильно?) - совсем не в этом. Вобщем, до профессионала мне - как до Луны пешком.

Уважаемый softwarer, Вы могли бы расскрыть смысл замечаний по моим фразам:
kordaТаблица отсортирована по KOD_INSTRUMENTA + DATA_PROVERKI
Вы имели ввиду, что таблица - понятие абстрактное и бессмысленно говорить о её внутреннем представлении, так как оно является внутренним делом конкретного сервера, а когда мы имеем дело с запросами, то подразумеваем, что не таблица отсортирована, а результат запроса мы получаем в отсортированном виде. Это Вы имели ввиду?

kordaК тому-же, хотелось какого-либо стандартного решения, поддерживаемого большинством СУБД.
softwarerПроизносите эти слова каждый раз, когда хотите, чтобы Вас перестали считать вменяемым разработчиком.

А здесь что не так? :)
...
Рейтинг: 0 / 0
Выборка из таблицы истории
    #35585774
Фотография barrabas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
korda
kordaК тому-же, хотелось какого-либо стандартного решения, поддерживаемого большинством СУБД.
softwarerПроизносите эти слова каждый раз, когда хотите, чтобы Вас перестали считать вменяемым разработчиком.

А здесь что не так? :)
Нужно уметь использовать возможности конкретной субд, особенно если за нее заплатили деньги.
...
Рейтинг: 0 / 0
Выборка из таблицы истории
    #35603647
KOT MATPOCKuH
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В Oracle самый быстрый результат даст, при наличии индекса по KOD_INSTRUMENTA:

SELECT KOD_INSTRUMENTA, DATA_PROVERKI, REZULTAT
FROM (
SELECT
KOD_INSTRUMENTA, DATA_PROVERKI, REZULTAT
, MAX(DATA_PROVERKI) OVER(PARTITION BY KOD_INSTRUMENTA) AS MaxDate
FROM YourTbl
) t1
Where DATA_PROVERKI = MaxDate

- это к слову о специфике БД.
Вообще, OLAP - это сила!
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Выборка из таблицы истории
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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