SQL: список строк, в которых нет транзакций - PullRequest
0 голосов
/ 29 апреля 2019

У меня есть таблица для определения - def

Id        Device            Location
1         GGHY199           USA
12        DFGHY71           India
145       APPHY75           USA

И его транзакции записываются в таблицу diff -event

eventid        deviceid         event                date
123              12             Login              12-01-2019
32               12             Unreachable        18-02-2019
223              145            Unreachable        19-02-2019
334              1              DOWN               01-03-2019

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

eventid        deviceid         event                date
null             1              null               01-01-2019
123              12             Login              12-01-2019
null             145            null               01-01-2019
null             1              null               01-02-2019
32               12             Unreachable        18-02-2019
223              145            Unreachable        19-02-2019
334              1              DOWN               01-03-2019
null             12             null               01-03-2019
null             145            null               01-03-2019

В настоящее время я делаю:

select * from def
left join 
event on def.id=event.deviceid

и я, очевидно, не получаю то, что я хочу.

Спасибо!

Ответы [ 3 ]

1 голос
/ 29 апреля 2019

Предполагая, что у вас есть действительная таблица календаря на всю нужную вам дату (имитирует таблицу select union all t), вы можете попробовать использовать левое соединение между calendare и таблицей других

select t.date, e.eventid, e.device, e.event, d.device
from (
  select   '2019-01-01'  date 
  union all 
  select   '2019-01-02' 
  union all 
  select   '2019-01-03' 
  .....
  union all 
  select   '2019-03-31' 
) t 
left event e on t.date = e.event 
left join device d  on e.device = d.id 
0 голосов
/ 29 апреля 2019

Используя CTE table, мы можем создать даты и затем соединить их с таблицей событий.

with t0 (i)    as (select 0  union all  select 0  union all  select 0),
     t1 (i)    as (select a.i from t0 a ,t0 b ),
     t2 (i)    as (select a.i from t1 a ,t1 b ),
     t3 (srno) as (select row_number()over(order by a.i) from t2 a ,t2 b ),
     tbldt(dt) as (select dateadd(day,t3.srno-1,'01/01/2019') from t3)   
select eventid, deviceid, event, tbldt.dt 
from tbldt
left join event e on e.date = tbldt.dt
left join def d  on e.deviceid = d.id 
where tbldt.dt <= (select max(date) from event)
0 голосов
/ 29 апреля 2019

Кажется, вы стремитесь к чему-то вроде этого ...

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(event_id SERIAL PRIMARY KEY
,device_id INT NOT NULL
,event VARCHAR(12) NOT NULL
,date DATE NOT NULL
);

INSERT INTO my_table VALUES
(123, 12,'Login','2019-01-12'),
( 32, 12,'Unreachable','2019-02-18'),
(223,145,'Unreachable','2019-02-19'),
(334,  1,'DOWN','2019-03-01');

 SELECT DISTINCT z.event_id
               , x.device_id
               , z.event
               , y.date 
            FROM my_table x 
            JOIN my_table y 
            LEFT 
            JOIN my_table z 
              ON z.device_id = x.device_id 
             AND z.date = y.date 
           ORDER 
              BY date
               , device_id;
+----------+-----------+-------------+------------+
| event_id | device_id | event       | date       |
+----------+-----------+-------------+------------+
|     NULL |         1 | NULL        | 2019-01-12 |
|      123 |        12 | Login       | 2019-01-12 |
|     NULL |       145 | NULL        | 2019-01-12 |
|     NULL |         1 | NULL        | 2019-02-18 |
|       32 |        12 | Unreachable | 2019-02-18 |
|     NULL |       145 | NULL        | 2019-02-18 |
|     NULL |         1 | NULL        | 2019-02-19 |
|     NULL |        12 | NULL        | 2019-02-19 |
|      223 |       145 | Unreachable | 2019-02-19 |
|      334 |         1 | DOWN        | 2019-03-01 |
|     NULL |        12 | NULL        | 2019-03-01 |
|     NULL |       145 | NULL        | 2019-03-01 |
+----------+-----------+-------------+------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...