kzen.dev
  • Вопросы
  • Метки
  • Пользователи
Оповещения
Вознаграждения
Регистрация
После регистрации, сможете получать уведомления об ответах и комментариях на Ваши вопросы.
Вход
Если у Вас уже есть аккаунт, войдите чтобы проверить новые уведомления.
Тут будут вознаграждения за добавленные вопросы, ответы и комментарий.
Дополнительно
Источник
Редактировать
 jacobronniegeorge
jacobronniegeorge
Вопрос

Запрос не возвращает все результаты

У меня есть 881 строка, которые должен вернуть запрос ниже, но возвращает только 744:

SELECT MIN(DateTime),AVG(ISNULL((Convert(decimal(10,3),SCR1_EXHAUST_GAS_TEMP)),0))
FROM jmusa_LOG1
GROUP BY DATEPART(HH,DateTime),DATEPART(DD,DateTime)
ORDER BY MIN(DateTime)

Теперь, если я выполню эти два запроса отдельно, я получу 588 и 293, соответственно, что равно 881, которые мне нужны:

SELECT MIN(DateTime),AVG(ISNULL((Convert(decimal(10,3),SCR1_EXHAUST_GAS_TEMP)),0))
FROM jmusa_LOG1
WHERE SCR1_EXHAUST_GAS_TEMP IS NULL
GROUP BY DATEPART(HH,DateTime),DATEPART(DD,DateTime)
ORDER BY MIN(DateTime)

Ключевым отличием в приведенном выше запросе является оператор WHERE.

SELECT MIN(DateTime),AVG(ISNULL((Convert(decimal(10,3),SCR1_EXHAUST_GAS_TEMP)),0))
FROM jmusa_LOG1
WHERE SCR1_EXHAUST_GAS_TEMP IS NOT NULL
GROUP BY DATEPART(HH,DateTime),DATEPART(DD,DateTime)
ORDER BY MIN(DateTime)

Здесь также имеется то же самое ключевое различие, только обратите внимание на разницу в том, что в одном случае IS NULL, а в другом IS NOT NULL.

**Кто-нибудь знает, почему это происходит? И каковы мои возможные ошибки, из-за которых первый упомянутый запрос не возвращает все 881 результат?

Менеджер БД: SQL Server 2008 R2, и SSMS Формат даты (если необходимо): YYYY-MM-DD HH:MM:SS.000

0 2012-07-06T18:18:02+00:00 3
Программирование
sql
sql-server
group-by
select
average
Gordon Linoff
Gordon Linoff
6-го июля 2012 в 6:22
2012-07-06T18:22:45+00:00
Дополнительно
Источник
Редактировать
#16623777

У вас есть комбинации из:

DATEPART(HH,DateTime),DATEPART(DD,DateTime)

где DATEPART(HH,DateTime),DATEPART(DD,DateTime) принимают значения как NULL, так и не NULL.

Другими словами, группы, определенные двумя отдельными запросами, пересекаются.

3
0
 LSerni
LSerni
6-го июля 2012 в 6:31
2012-07-06T18:31:45+00:00
Дополнительно
Источник
Редактировать
#16623778

Вы действительно уверены, что комбинация HH, DD и NULL(SCR1_EXHAUST) уникальна?

Если две строки, даже если они имеют разные DateTime, все же имеют одинаковые HH и DD, и одна из них имеет NULL SCR1_EXHAUST_GAS_TEMP, а другая не имеет NULL, GROUP BY объединит их в одну строку.

В этом случае вам нужно будет сгруппировать и по ISNULL(SCR1_EXHAUST_GAS_TEMP).

SELECT MIN(DateTime),AVG(ISNULL((Convert(decimal(10,3),SCR1_EXHAUST_GAS_TEMP)),0))
FROM jmusa_LOG1
GROUP BY ISNULL(SCR1_EXHAUST_GAS_TEMP, 0)=0, DATEPART(HH,DateTime),DATEPART(DD,DateTime)
ORDER BY MIN(DateTime)

...или, возможно, 744 строки - это то, что вам нужно.

Теперь, если вы хотите увидеть все даты, но для некоторых из них у вас есть нежелательные значения, то вам нужно:

  • подготовить первый набор, извлекая отдельные значения YYYY, MM, DD, HH, и это будет ваш "календарь"
  • подготовить второй набор, в котором вы будете усреднять ненулевые значения temp, группируя по YYYY, MM, DD и HH
  • LEFT JOIN календарь с данными, соединяясь по YYYY, MM, DD и HH и получая их, плюс TEMP, и упорядочивая по y, m, d, h.

Это даст вам что-то вроде,

Year Mo Da HH Temp
2012 07 07 00  750
2012 07 07 01  633
2012 07 07 02  NULL    <-- from 02:00 to 02:59 we only have junk!
2012 07 07 03  660     (actually, when going from summer time to winter time...)
2012 07 07 04  680
 LSerni
LSerni
Редактировал ответ 6-го июля 2012 в 7:10
2
0
 tschmit007
tschmit007
6-го июля 2012 в 6:40
2012-07-06T18:40:18+00:00
Дополнительно
Источник
Редактировать
#16623779

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

SELECT DATEPART(HH,DateTime),DATEPART(DD,DateTime)
FROM jmusa_LOG1
WHERE SCR1_EXHAUST_GAS_TEMP IS NULL
GROUP BY DATEPART(HH,DateTime),DATEPART(DD,DateTime)

intersect

SELECT DATEPART(HH,DateTime),DATEPART(DD,DateTime)
FROM jmusa_LOG1
WHERE SCR1_EXHAUST_GAS_TEMP IS NOT NULL
GROUP BY DATEPART(HH,DateTime),DATEPART(DD,DateTime)
1
0
Похожие сообщества 4
DBA - русскоговорящее сообщество
DBA - русскоговорящее сообщество
3 542 пользователей
Общаемся и обсуждаем темы, посвященные DBA, PostgreSQL, Redis, MongoDB, MySQL, neo4j, riak и т.д. См. также: @devops_ru, @kubernetes_ru, @docker_ru, @nodejs_ru Рекомендуем сразу отключить уведомления, чтобы пребывание здесь было полезным и комфортным.
Открыть telegram
sql_ninja
sql_ninja
2 520 пользователей
Канал для тех, кто знает или интересуется SQL 🛢 Взаимная помощь и позитив =) Вакансии тут - @sql_jobs Бан за: оскорбления, спам, фри рекламу, расизм, сексизм. Наш MSSQL канал - @sqlcom По рекламе: @aveLestat
Открыть telegram
SQL JOBS
SQL JOBS
2 144 пользователей
Обязательны: компания, город, позиция, вилка, наличие удалёнки, требования, контакты. Бан за рекламу, сексизм, расизм и неадекватный обсёр объявлений
Открыть telegram
Lazarus : Database (Firebird, mySQL, SQLite, PostgreSQL, ...)
29 пользователей
Базы данных в Lazarus https://t.me/Delphi_Lazarus (по-русски) https://t.me/Delphi_Lazarus_offtop https://t.me/freepascal_en (по-английски) по темам: https://t.me/Lazarus_Database https://t.me/Lazarus_Graphics https://t.me/Lazarus_Android
Открыть telegram
Добавить вопрос
Категории
Все
Технологий
Культура / Отдых
Жизнь / Искусство
Наука
Профессии
Бизнес
Пользователи
Все
Новые
Популярные
1
Ilya Smirnov
Зарегистрирован 6 дней назад
2
Денис Васьков
Зарегистрирован 1 неделю назад
3
Dima Patrushev
Зарегистрирован 1 неделю назад
4
sirojidddin otaboyev
Зарегистрирован 2 недели назад
5
Елена Гайдамамакинат
Зарегистрирован 2 недели назад
RU
© kzen.dev 2023
Источник
stackoverflow.com
под лицензией cc by-sa 3.0 с атрибуцией