Как выбрать из MySQL все строки, которые попадают в месяц, но могут иметь даты в следующем месяце? - PullRequest
0 голосов
/ 04 апреля 2020

У меня есть таблица, которая выглядит примерно так:

ID | netID | indate             | outdate           | name    | org
=====================================================================
1  |  50   | 2020-03-31 23:50   | 2020-03-31 23:32  | Bill    | orgA
2  |  50   | 2020-03-31 23:51   | 2020-03-31 23:32  | Fred    | orgA
3  |  50   | 2020-04-01 00:02   | 2020-04-01 00:05  | Sam     | orgA

4  |  51   | 2020-03-31 23:50   | 2020-03-31 23:32  | Harry   | orgB    
5  |  51   | 2020-03-31 23:51   | 2020-03-31 23:32  | George  | orgB
6  |  51   | 2020-04-01 00:02   | 2020-04-01 00:05  | Tom     | orgB

Мне нужно написать отчет по org & year & month, но любая строка с таким же netID должна быть включена, даже если она его в другой год или месяц. И я не могу сказать «ГДЕ netID = 50», например, потому что я не знаю, что такое netID в месяце «03» года «2020».

Я ищу первые три строки, которые нужно вернуть, если мне нужен отчет за март 2020 года для orgA.

Ниже не работает то, что мне нужно, и я не могу понять, как получить все строки для каждого netID независимо от месяца , Может кто-нибудь дать мне пример того, как их получить?

SELECT date(iodate) as logdate,
       Name,
       netID,
       COALESCE( netID, 'Month Total') AS netTTL,
       COUNT(ID) AS idCount,
       month(logdate AS month    
  FROM table
 WHERE org = 'orgA'
   AND year(indate) = '2020'
   AND month(iodate) = '03'
 GROUP BY year(logdate), month, netID WITH ROLLUP

1 Ответ

0 голосов
/ 04 апреля 2020

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

SELECT t1.*
       FROM (SELECT DISTINCT
                    t2.netid
                    FROM elbat t2
                    WHERE t2.org = 'orgA'
                          AND t2.indate >= '2020-03-01'
                          AND t2.indate < '2020-04-01') x
            INNER JOIN elbat t1
                       ON t1.netid = x.netid;

Несколько замечаний:

  • Вы должны использовать выражения диапазона вместо применения year() и month() к дате в WHERE пункт. Выражения диапазона могут использовать индексы и ускорять запрос.
  • В вашем запросе есть столбцы / выражения, которые не применяются ни к функции агрегирования, ни к GROUP BY. Хотя старые или плохо настроенные серверы MySQL принимают это, это может привести к забавным результатам. Но так как вы не объяснили, что вы хотите там делать, сказать здесь нечего больше, чем «Вы делаете это неправильно!».
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...