POSTGRESQL: извлечение минимального значения для каждого окна - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть данные как показано ниже:

 IP        username   time1  
-----      ------      -----  
1.2.3.4      abc      01:00  
1.2.3.4      abc      02:00  
1.2.3.4      abc      03:00  
1.2.3.4      pqr      04:00  
1.2.3.4      pqr      05:00  
1.2.3.4      pqr      06:00  
1.2.3.4      pqr      07:00  
1.2.3.4      abc      08:00  
1.2.3.4      abc      09:00  
1.2.3.5      abc      10:00  
1.2.3.5      abc      11:00  

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

IP        username   time1  
-----      ------      -----  
1.2.3.4      abc      01:00  
1.2.3.4      pqr      04:00  
1.2.3.4      abc      08:00  
1.2.3.5      abc      10:00  

Я пытаюсь сделать что-то вроде этого:

select ip, usrnm, time1  
from (select ROW_NUMBER() over(partition by ip, usrnm order by time1)as 
rownum,ip, usrnm, time1 from table1)t2 
where t2.rownum = 1

Но я не могу захватить

1.2.3.4 abc 08:00

Любойключ?

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

Этот ответ не так хорош, как опубликованный, но он вдохновлен первым вопросом, который я когда-либо задавал о переполнении стека и хотел передать дань:

Oracle / Sybase SQL - получитьзначение на основе предыдущей записи (не простая группа LAG)

with change_data as (
  select
    ip, username, time1,
    case
      when lag (username) over (partition by ip order by time1) = username
        then 0
      else 1
    end as newrecord
  from table1
),
groups as (
  select
    ip, username, time1,
    sum (newrecord) over (order by time1) as instance
  from change_data
)
select
  ip, username, min (time1) as min_time
from groups
group by
  ip, username, instance
order by
  min_time
0 голосов
/ 18 декабря 2018

Используйте lag(), чтобы проверить, является ли запись первой из «группы».

SELECT ip,
       username,
       time1
       FROM (SELECT ip,
                    username,
                    time1,
                    coalesce(lag(ip) OVER (ORDER BY time1) <> ip
                              OR lag(username) OVER (ORDER BY time1) <> username,
                             true) x
                    FROM elbat) x
       WHERE x;

db <> fiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...