Почему не все даты выводятся в SQL-запросе «group by»? - PullRequest
0 голосов
/ 05 февраля 2019

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

Я использую Oracle SQL Developer для запуска запроса на группирование по полю даты.Я не продвинутый пользователь SQL, но использовал этот сайт, чтобы научить себя немного.Тем не менее, я не могу найти ответ на мою проблему.Одна из дат не получает выходные данные, и я не уверен, почему.Может кто-нибудь помочь?

Запрос

select date_added, count(*)
from table_a
where date_added >= '28-JAN-19'
group by date_added
order by date_added

Результаты

28-JAN-19 39
30-JAN-19 29
31-JAN-19 20

Должна быть дата '29-JAN-19'здесь.

Использование оператора like для получения '29-JAN-19' даты:

Запрос

select date_added, count(*)
from table_a
where date_added like '%9-JAN-19%'
group by date_added
order by date_added ASC

Результат

29-JAN-19 30
09-JAN-19 912
19-JAN-19 13

Сначала выполняется сортировка с '29-JAN-19', что также неверно.

Почему трактуется '29-JAN-19' как что-то еще, кроме DATE, когда DATA_TYPE = DATE дляэто поле?Я не вижу никаких пробелов или пробелов.Я действительно в замешательстве и не могу найти какие-либо аналогичные проблемы или ответы.Справка?

Редактировать: Добавление информации о таблице и данных примера.Примечание. Я удаляю / обновляю значения данных, которые являются частными для нашей организации.Здесь я использовал мастер экспорта в этой таблице, чтобы показать первые 4 столбца, включая дату.

CREATE TABLE table_A 
(
  UNIQUE_ID NUMBER(20, 0) NOT NULL 
, CAMPAIGN_ID NUMBER 
, DIGITAL_VENDOR VARCHAR2(100 BYTE) 
, DATE_ADDED DATE 
, 

В приведенной ниже ссылке / изображении показаны операторы "вставки в" из мастера экспорта для обеих 1/29/ 19 (отсутствующая дата вывода) и 1/30/19 (что видно на выходе).

введите описание изображения здесь

Вот некоторые примеры данных (note Примечание. CAMPAIGN_ID имеет нулевые значения)

UNIQUE_ID   CAMPAIGN_ID DIGITAL_VENDOR  DATE_ADDED
359002      abc 29-JAN-19
355293      abc 30-JAN-19
355322      abc 31-JAN-19

Дополнительное редактирование: я смог получить доступ к файлам необработанных данных, поступающих от поставщика.Они находятся в CSV, и когда мы открывали их в стандартном Excel, даты выглядели нормально и все одинаково отформатированы.Тем не менее, я решил открыть в Блокноте, и вот когда я вижу, что даты все разные:

01/29/2019
1/29/19 
01/30/2019
2/4/19
02/05/2019

Теперь даты как 29.01.19, так и 02.04.19 не отображаются в моем запросе.Так что с этой новой информацией у меня все еще есть несколько вопросов:

  1. Было бы в нашем праве попросить продавца отправить дату в стандартном формате (если предположить, что это то, чтоони могут контролировать) или наши таблицы должны быть обновлены, чтобы исправить это?

  2. Есть ли еще способ запросить наши таблицы с указанными датами?

  3. Есть ли способ исправить это, чтобы независимо от форматов даты он был стандартизирован?

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

Дополнительная информация:

Я добавляю образец дампа данных дат в качестве запроса.Я вижу разницу между первыми двумя датами, с которыми у меня возникла проблема, но я не уверен, что это значит или как исправить.Спасибо!

DATE_ADDED DUMP(DATE_ADDED) 29-JAN-19 Typ=12 Len=7: 100,119,1,29,1,1,1 04-FEB-19 Typ=12 Len=7: 100,119,2,4,1,1,1 20-APR-17 Typ=12 Len=7: 120,117,4,20,1,1,1 21-APR-17 Typ=12 Len=7: 120,117,4,21,1,1,1 25-APR-17 Typ=12 Len=7: 120,117,4,25,1,1,1

Ответы [ 3 ]

0 голосов
/ 06 февраля 2019

Это не ответ, а комментарий, который не помещается в разделе комментариев.

В соответствии с запросом, я попробовал ваши примеры данных в Oracle 10g и нашел ваш первоначальный запросработает как положено.Я немного изменил ваш запрос, чтобы использовать стандартный DATE литерал в Oracle вместо простого литерала VARCHAR2, но кроме этого это тот же код.

Вот пример предоставленных данныхот вас (я добавил пару строк):

create table table_a (
  unique_id number(20,9) not null,
  campaign_id number(20,0),
  digital_vendor varchar2(100 byte),
  date_added date
);

insert into table_a (unique_id, campaign_id, digital_vendor, date_added)
  values (359002, null, 'abc', to_date('27/01/2019', 'dd/mm/yyyy'));
insert into table_a (unique_id, campaign_id, digital_vendor, date_added)
  values (359002, null, 'abc', to_date('28/01/2019', 'dd/mm/yyyy'));
insert into table_a (unique_id, campaign_id, digital_vendor, date_added)
  values (359002, null, 'abc', to_date('29/01/2019', 'dd/mm/yyyy'));
insert into table_a (unique_id, campaign_id, digital_vendor, date_added)
  values (355293, null, 'abc', to_date('30/01/2019', 'dd/mm/yyyy'));
insert into table_a (unique_id, campaign_id, digital_vendor, date_added)
  values (355322, null, 'abc', to_date('31/01/2019', 'dd/mm/yyyy'));

Затем ваш запрос (слегка измененный):

select date_added, count(*)
from table_a
where date_added >= to_date('28/01/2019', 'dd/mm/yyyy')
group by date_added
order by date_added

И результат, который я вижу:

DATE_ADDED  COUNT(*)
----------  --------
2019-01-28  1
2019-01-29  1
2019-01-30  1
2019-01-31  1

Итак, он работает как положено.

Я предполагаю, что использование литерала VARCHAR2 создает проблему.На этом этапе вы также используете английские имена в течение нескольких месяцев, что может быть проблематично в некоторых установках с нестандартными настройками или специально локализованными настройками.Я бы посоветовал использовать цифры для месяцев при запросах.Однако при отображении дат вы можете использовать любой формат, какой пожелаете.

0 голосов
/ 07 февраля 2019

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

create table t as
select to_date('29/01/2019', 'dd/mm/yyyy') c1 from dual union all
select to_date('04/02/2019', 'dd/mm/yyyy') c1 from dual union all
select to_date('20/04/2017', 'dd/mm/yyyy') c1 from dual union all
select to_date('21/04/2017', 'dd/mm/yyyy') c1 from dual union all
select to_date('25/04/2017', 'dd/mm/yyyy') c1 from dual union all
select to_date('29/01/0019', 'dd/mm/yyyy') c1 from dual union all
select to_date('04/02/0019', 'dd/mm/yyyy') c1 from dual;

, когда я выбираю дату для отображения полного года, плюс дамп, я вижу:

select c1, to_char(c1, 'dd/mm/yyyy') exp_c1, dump(c1) from t;

C1        EXP_C1     DUMP(C1)
--------- ---------- --------------------------------
29-JAN-19 29/01/2019 Typ=12 Len=7: 120,119,1,29,1,1,1
04-FEB-19 04/02/2019 Typ=12 Len=7: 120,119,2,4,1,1,1
20-APR-17 20/04/2017 Typ=12 Len=7: 120,117,4,20,1,1,1
21-APR-17 21/04/2017 Typ=12 Len=7: 120,117,4,21,1,1,1
25-APR-17 25/04/2017 Typ=12 Len=7: 120,117,4,25,1,1,1
29-JAN-19 29/01/0019 Typ=12 Len=7: 100,119,1,29,1,1,1
04-FEB-19 04/02/0019 Typ=12 Len=7: 100,119,2,4,1,1,1

(Вот db <> fiddle )

Обратите внимание на две нижние строки, которые имеют год 0019 вместо 2019 исоответствует выводу дампа, который вы предоставили.Это объясняет, почему они не были выбраны в запросе на поиск строк за 29 января 2019 года!

0 голосов
/ 05 февраля 2019

Предполагая, что столбец date_added имеет тип данных DATE, вам необходимо преобразовать опорную дату в реальную дату перед сравнением, используя TO_DATE().Как прокомментировал Boneist, также лучше использовать четырехзначные годы, например:

select date_added, count(*)
from table_a
where date_added >= to_date('28/01/2019', 'dd/mm/yyyy')
group by date_added
order by date_added
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...