Как выбрать строки, которые имеют разные значения столбца и имеют общий столбец [значение даты] - PullRequest
0 голосов
/ 10 мая 2018

Я пытаюсь сделать какую-то комбинацию строк. Мой стол такой

┌─────────┬────────────────┬────────────────┐
│Machine_N│      Date      │      Action    │
├─────────┼────────────────┼────────────────┤
│      RS1│ 2018-02-08     │        Reading │
│      RS1│ 2018-02-08     │       Referred │
│      RS1│ 2018-02-16     │        Reading │
│      RS2│ 2018-01-31     │        Reading │
│      RS2│ 2018-01-31     │       Referred │
└─────────┴────────────────┴────────────────┘

Как выбрать только Действия, где Дата одинакова, поэтому набор результатов будет:

┌─────────┬────────────────┬────────────────┐
│Machine_N│      Date      │      Action    │
├─────────┼────────────────┼────────────────┤
│      RS1│ 2018-02-08     │        Reading │
│      RS1│ 2018-02-08     │       Referred │
│      RS2│ 2018-01-31     │        Reading │
│      RS2│ 2018-01-31     │       Referred │
└─────────┴────────────────┴────────────────┘

Я попробовал пункт с подсчетом, но не повезло Любая помощь будет оценена.

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Использование subquery:

select * 
from table t
where date = (select top (1) [date] 
              from table 
              where machine_n = t.machine_n 
              group by date
              order by COUNT(1) desc
             );

Однако не в большинстве СУБД есть предложение TOP, поэтому вместо него можно использовать предложение LIMIT

select * 
from table t
where date = (select [date] 
              from table 
              where machine_n = t.machine_n 
              group by date
              order by COUNT(1) desc
              LIMIT 1
              );
0 голосов
/ 10 мая 2018

Если у вас нет дубликатов, вы можете использовать exists:

select t.*
from t
where exists (select 1 from t t2 where t2.machine_n = t.machine_n and t2.date = t.date and t2.action <> t.action);

Другой метод использует оконные функции:

select t.*
from (select t.*, count(*) over (partition by machine_n, date) as cnt
      from t
     ) t
where cnt > 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...