Выберите запись с помощью MIN (DATE) - PullRequest
3 голосов
/ 29 февраля 2012

Итак, очень простой запрос, но я не уверен, правильно ли я его понял, так как я делаю это на бумаге и у меня нет СУБД, где я могу его примерить. Это упражнение для экзамена в колледже. У меня есть эта таблица:

    Serv_req
    =============
PK  Svr_ID
    State
    Req_Date
    Description

Они просто просят меня показать данные для самого старого Serv_Req, который имеет состояние "Открыть" в качестве состояния.

То, что я написал до сих пор:

SELECT Svr_ID, State, Description, MIN(Req_Date)
FROM Serv_req
WHERE State LIKE 'Open'
GROUP BY Svr_ID, State, Description

Теперь, это вернет ТОЛЬКО запись с информацией для самого старого Svr_req? или он вернет список ВСЕХ «открытых» требований с указанием даты самого старого в конце?

UPDATE

Я забыл упомянуть. К сожалению, правила курса не позволяют нам использовать SELECT TOP, LIMIT 1 или даже подзапросы для создания вспомогательных таблиц в операторе FROM.

Заранее спасибо за помощь, ребята!

ОБНОВЛЕНИЕ 2 Итак, увидев первый запрос, который я написал, совершенно неправильно, я даю ему вторую попытку. Пожалуйста, скажите мне, если вы считаете, что это правильно:

SELECT Svr_id, State, Description
FROM Serv_req
WHERE State LIKE 'Open'
AND Req_Date = (SELECT MIN(S1.Req_date)
                FROM Serv_req S1
                WHERE S1.State LIKE 'Open'
                )

Я знаю, что это не самый ясный / самый эффективный способ выполнить этот запрос, но с учетом ограничений, налагаемых моим курсом, это лучшее, что я мог придумать. Что, вы парни, думаете? Это кажется правильным?

Ответы [ 3 ]

4 голосов
/ 29 февраля 2012

Приятно видеть кого-то еще из ARG:)

Ну, в основном ваш запрос не работает. Вам нужно удалить свой второй SELECT, но только ключевое слово, а не поля. Что касается вопроса, который вы задаете, я думаю, вы не совсем получили GROUP BY.

GROUP BY в этом случае будет принимать все Svr_ID, State, Description, которые являются отличными (то есть, которые создают уникальный кортеж), а MIN(Req_Date) будет брать минимум из элементов, которые были сгруппированы для каждого из отдельных элементов.

Теперь, если Svr_ID - это PK, ваш GROUP BY на самом деле ничего не будет группировать, потому что Svr_ID сам по себе "различен", независимо от полей состояния и описания. Это означает, что запрос такой же, как этот запрос:

SELECT Svr_ID, State, Description, Req_Date
FROM Serv_req
WHERE State LIKE 'Open'

Это немного яснее?

Edit:

Итак, вы сказали, что у вас нет СУБД, где вы можете попробовать эти запросы, поэтому позвольте мне познакомить вас с SQLFiddle . Я бы порекомендовал вам любую СУБД, кроме Oracle, потому что синтаксис для создания новых таблиц и вставки записей может быть немного недружественным.

Теперь я также добавляю один ответ на ваш вопрос здесь . Я не вставляю ответ, чтобы вы нашли время и поиграли с ним. Таблицы, с которыми можно поиграть: здесь , так что это должно стать отправной точкой для проверки ваших запросов ... но помните, всегда пытайтесь сначала решить их на бумаге ... вы не будете в состоянии проверить их на экзамене :) 1030 *

1 голос
/ 29 февраля 2012

РЕДАКТИРОВАТЬ Поскольку вы не можете использовать трюк или подзапросы TOP 1, вам нужно придумать условие, в котором излагается определение MIN, используя элементарные отношения "меньше чем".

Подумайте о проблеме с точки зрения сравнения каждой записи со всеми записями в одной таблице.Вы можете сделать это путем создания самостоятельного объединения таким образом, чтобы все записи, которые вы выбираете из таблицы, к которой вы подключаетесь, имели более раннюю дату.Будут некоторые записи, для которых невозможно найти пару со строго более ранней датой;это запись, которую вы хотите.Очевидно, вам нужно external объединение, чтобы привести базовую запись в результаты, потому что совпадение не существует.Запись, которую вы ищете, будет иметь уникальную структуру, позволяющую идентифицировать ее среди записей, которые вы не хотите видеть.

0 голосов
/ 03 сентября 2017

Если посмотреть по-другому, вопрос задает самый старый Serv_Req.Принимая это буквально, результатом является одна запись, то есть самая старая открытая.В этом случае самая первая попытка («То, что я написал до сих пор:») без предложения Group By дала бы ответ.ПОЦЕЛУЙ - держи это невероятно простым

...