Необходима ли функция в предложении GROUP BY?

Я новичок в Oracle, просто пытаюсь учиться.

Являются ли следующие два запроса эквивалентными с точки зрения их результатов?

Запрос 1

SELECT
    COUNT( customers.id ) AS "id",
    customers.full_name AS "name",
    customers.cty AS "country",
    TO_CHAR( customers.date, 'mm/dd/yyyy' ) AS "date"

FROM customers

GROUP BY
    customers.full_name,
    customers.cty,
    TO_CHAR( customers.date, 'mm/dd/yyyy' );

Запрос 2: нет TO_CHAR() в предложении GROUP BY

SELECT
    COUNT( customers.id ) AS "id",
    customers.full_name AS "name",
    customers.cty AS "country",
    TO_CHAR( customers.date, 'mm/dd/yyyy' ) AS "date"

FROM customers

GROUP BY
    customers.full_name,
    customers.cty,
    customers.date;

Я использую Oracle версии 12.1.

TO_CHAR` не является агрегатной функцией, и все столбцы в списке SELECT, которые не являются агрегированными, должны быть в GROUP BY. Однако в вашем первом вы не включили customers.city в GROUP BY, так что это все равно неправильно. Во втором тоже отсутствует тот же столбец. Почему вы не могли проверить это на себе?

Ken White 10.04.2022 00:44

Кроме того, date нельзя использовать без кавычек, как в customes.date, так как это зарезервированное ключевое слово.

Barbaros Özhan 10.04.2022 00:45

@KenWhite, я включил customers.cty в первое предложение GROUP BY. Я не могу проверить это сам, потому что у меня нет доступа к системе прямо сейчас.

GTS Joe 10.04.2022 00:52

@КенУайт город? Почему это должно быть там? и "TO_CHAR` не является агрегатной функцией" - я не вижу, чтобы она упоминалась как агрегатная...

Sayan Malakshinov 10.04.2022 00:53

@GTSJoe Они не равны, так как столбцы даты могут содержать время (часы, минуты, секунды), поэтому при агрегировании по to_char(..., 'mm/dd/yyyy' ) вы теряете часть времени.

Sayan Malakshinov 10.04.2022 00:55

агрегирование по to_char(date_col, 'mm/dd/yyyy' ) похоже на агрегирование по truncate(date_col, 'dd'), а не на date_col

Sayan Malakshinov 10.04.2022 00:57

@SayanMalakshinov Но есть ли разница в результирующем наборе, если я опускаю TO_CHAR() или он возвращает то же самое?

GTS Joe 10.04.2022 00:57
«Но это меняет результирующий набор, если я опускаю TO_CHAR()» TO_CHAR возвращает строку символов. Мы предполагаем, что столбец customers.date имеет тип данных DATE, который представляет собой структуру бинарный, а не строку символов. Так . . . TO_CHAR(когда-то) не равно когда-то. Что касается "У меня сейчас нет доступа к системе", почему у вас нет собственной системы обучения/тестирования? См. Частная тестовая лаборатория оракула
EdStevens 10.04.2022 01:02

Вам даже не нужна собственная база данных, когда есть такие сайты, как livesql.oracle.com, dbfiddle.uk и sqlfiddle.com, где вы можете мгновенно тестировать запросы и делиться ссылкой.

William Robertson 10.04.2022 01:06

Простой пример: dbfiddle.uk/…

Sayan Malakshinov 10.04.2022 01:09
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
10
46
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Нет. Я даже не думаю, что второй будет работать, поскольку ваш GROUP BY не соответствует вашему SELECT (за исключением агрегированных полей, таких как COUNT (*)

Если вы группируете столбец по дате, вы форматируете его могу, используя to_char в списке выбора, см. второй запрос здесь: dbfiddle.uk/…

Sayan Malakshinov 10.04.2022 01:12

Если вы группируете по базовому столбцу, но используете функцию из списка select, функция применяется к агрегированным результатам, т. е. один раз на группу, что может существенно повлиять на производительность, особенно при использовании пользовательской функции.

William Robertson 10.04.2022 01:22

Ваш ответ может быть улучшен с помощью дополнительной вспомогательной информации. Пожалуйста, редактировать добавьте дополнительную информацию, например цитаты или документацию, чтобы другие могли подтвердить правильность вашего ответа. Дополнительную информацию о том, как писать хорошие ответы, можно найти в справочном центре.

Community 10.04.2022 04:00
Ответ принят как подходящий

Оба запроса не вернут один и тот же результат... если только customers.date не включает только даты без временной части. Тип DATE в Oracle включает часть даты, а также часть времени. Так что это эквивалентно отметке времени.

Первый запрос группируется по целым дням, а второй — по дате/часу/минуте/секунде.

Короче говоря, это был ответ, который я искал, что на самом деле запросы НЕ вернут тот же результат. Есть разница. Я действительно ДОЛЖЕН придерживаться Query 1. Особая благодарность всем тем, кто предложил протестировать код самостоятельно. Я создал учетную запись Oracle и протестировал запросы, используя их игровую площадку «Oracle Live SQL». Спасибо всем, кто написал, этот новичок в Oracle ценит это и будет продолжать учиться! 😊

GTS Joe 10.04.2022 03:40

Другие вопросы по теме