SQL: выберите наиболее часто встречающееся значение, соответствующее другому столбцу. - PullRequest
0 голосов
/ 14 мая 2018

Может ли кто-нибудь указать мне правильное решение для моей проблемы.У меня есть таблица -

+------+-------+--------------------------------------+
| id   | num   | date                                 |
+------+-------+--------------------------------------+
| a    | 1     | 2011-08-12T20:17:46.384Z             |
| a    | 1     | 2011-08-12T20:18:46.384Z             |
| a    | 2     | 2011-08-12T20:19:46.384Z             |
| a    | 2     | 2011-09-12T20:17:46.384Z             |
| c    | 3     | 2011-09-12T20:18:46.384Z             |
+------+-------+--------------------------------------+

Теперь для заданного диапазона дат я хочу получить самое встречающееся значение столбца «num» для значения «id».

Результатдля диапазона (2011-08-12T00: 00: 00.000Z до 2011-08-12T23: 59: 00.000Z) должно быть

| a    | 1     | 090518                               |

По сути, я хочу получить наиболее встречающееся значение столбца, соответствующееидентификатор в заданном диапазоне dateTime.

Я буду использовать PostgreSQL.

Ответы [ 3 ]

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

Как это работает для вас?

 select max(c.id) id, c.num, c.cnt  from 
(select id, max(cnt) cnt from (
Select id, num, count(*) cnt 
from #temp 
group by id, num)a  group by id)b 
join 
(Select id, num, count(*) cnt 
from #temp 
group by id, num)c on b.id=c.id and b.cnt=c.cnt
group by c.num, c.cnt 
0 голосов
/ 14 мая 2018

Это должно вернуть что-то вроде этого:

| id | num | occurrences |

select id,num,count(num) as [occurrences]
from MyTable 
where  id = 'a' /* Given id */
and [date]  >= '2011-08-12T00:00:00.000Z' AND [date]  <= '2011-08-12T23:59:00.000Z' /* Given Range */
group by id,num
order by [occurrences] DESC 
0 голосов
/ 14 мая 2018

Стандартная формулировка ANSI - при условии, что date хранится как дата / время - будет:

select num, count(*)
from t
where date >= date '2018-05-09' and
      date < date '2018-05-10'
group by num
order by count(*) desc
fetch first 1 row only;

Обратите внимание, что большинство баз данных будет иметь некоторые незначительные изменения этого синтаксиса. Кроме того, это только возвращает значение, если есть связи.

EDIT:

Вопрос в единственном числе:

Я хочу получить наиболее часто встречающееся значение столбца "num" для значения "id".

Однако, если вам нужны все эквивалентные значения в случае связи, то:

select num, cnt
from (select num, count(*) as cnt,
             rank() over (order by count(*) desc) as seqnum
      from t
      where date >= date '2018-05-09' and
            date < date '2018-05-10'
      group by num
     ) n
where seqnum = 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...