сравнить две даты между разными записями

Если вы посмотрите на страницу пакета на CRAN , вы увидите следующее:

SystemRequirements: для построения из источника: GDAL> = 1.7.1 библиотека из http://trac.osgeo.org/gdal/wiki/DownloadSource и PROJ.4 (proj> = 4.4.9) из http://trac.osgeo.org/ Рго / [/ д2]; Основы GDAL OSX, созданные Уильямом Кингсбери в http://www.kyngchaos.com/ , могут использоваться для установки источника в OSX.

Как вам кажется под Linux вы всегда создаете пакет из исходного кода, поэтому вам нужно будет установить соответствующие библиотеки в вашей системе. Если вы находитесь под Монетным двором, Ubuntu или другим производным Debian, вы можете сделать:

$ sudo apt-get install libgdal1-dev libproj-dev

. Один совет, который может быть полезен, все еще находящийся в системе на базе Debian, заключается в установке пакета apt-file и запуске :

$ sudo apt-file update

Затем, когда вы получите сообщение об ошибке, например:

configure: error: proj_api.h not found in standard or given locations.

Вы можете использовать следующую команду, чтобы определить, какой пакет вы должны установить, чтобы получить отсутствующий файл:

$ apt-file search proj_api.h
libproj-dev: /usr/include/proj_api.h

2
задан scaisEdge 17 January 2019 в 08:54
поделиться

8 ответов

Почему бы не использовать могучий LEAD / LAG?

SELECT * FROM (
SELECT id,
       event_type,
       event_date,
       user_id,
       CASE
         WHEN event_type = 'USER_DELETED' THEN LEAD(EVENT_DATE) OVER (PARTITION BY useR_id ORDER BY event_type DESC) 
         ELSE NULL
       END  AS CREATED
FROM   user_events
WHERE event_type IN ('USER_ACTIVATED','USER_DELETED')
)
WHERE created > event_date
0
ответ дан q4za4 17 January 2019 в 08:54
поделиться

спасибо всем за помощь! вы, ребята, потрясающие !! я пошел со 2-м запросом из первого ответа на этот пост:

SELECT USER_ID
FROM   USER_EVENTS
GROUP BY USER_ID
HAVING MIN( CASE EVENT_TYPE WHEN 'USER_DELETED' THEN EVENT_DATE END )
         < MIN( CASE EVENT_TYPE WHEN 'USER_ACTIVATED' THEN EVENT_DATE END )

работает как шарм, спасибо @MTO

0
ответ дан Dmoy 17 January 2019 в 08:54
поделиться

Я не могу решить, если это взломать, но просто для удовольствия:

select user_id
from   user_events
group by user_id
having listagg(event_type, ',') within group (order by event_date) like '%DELETED,%ACTIVATED%';
0
ответ дан William Robertson 17 January 2019 в 08:54
поделиться

Для одноразового упражнения (при условии, что базовая таблица не слишком велика), простым решением является подзапрос. Выберите всех удаленных пользователей, затем найдите все соответствующие активированные записи с более поздней датой события:

with del as ( 
 select user_id
        , event_date as date_deleted
 from user_events
 where event_type = 'USER_DELETED'
)
select del.user_id
      , del.date_deleted
      , act.event_date as date_activated
from del
     join user_events act
          on act.user_id = del.user_id
where act.event_type = 'USER_ACTIVATED'
and del.date_deleted < act.event_date
order by del.user_id
/

Как показывают другие ответы, существует много способов написать выше. Другое простое решение - самосоединение:

select del.user_id
      , del.date_deleted
      , act.event_date as date_activated
from user_events del
     join user_events act
          on act.user_id = del.user_id
where del.event_type = 'USER_DELETED'
and act.event_type = 'USER_ACTIVATED'
and del.date_deleted < act.event_date
order by del.user_id
/
0
ответ дан APC 17 January 2019 в 08:54
поделиться

Просто найдите удаления перед активацией:

With activations as
( select * from t where EVENT_TYPE="USER_ACTIVATED"
),
deletions as
( select * from t where EVENT_TYPE="USER_DELETED"
),
select *
from deletions d
left outer join activations a
on d.USER_ID = a.USER_ID and
   d.EVENT_DATE < a.EVENT_DATE   --here
0
ответ дан dani herrera 17 January 2019 в 08:54
поделиться

Вы можете использовать внутреннее соединение между набором строк строки, соединенным user_id и датой

select  user_id, event_date 
from USER_EVENTS  U
inner join  
(
select  user_id, event_date 
from USER_EVENTS 
where EVENT_TYPE ='USER_DELETED'
) T ON T.event_date < U.event_date 
    AND T.user_id= U.user_id  

WHERE EVENT_TYPE ='USER_ACTIVATED' 
0
ответ дан scaisEdge 17 January 2019 в 08:54
поделиться

вы можете попробовать, как показано ниже, используя объединение и подзапрос

select t1.USER_ID from 
(
select USER_ID,max(EVENT_DATE) as EVENT_DATE from 
USER_EVENTS where EVENT_TYPE='USER_ACTIVATED'
group by USER_ID
) t1 
join
select * from 
(
select USER_ID,max(EVENT_DATE) as EVENT_DATE from 
USER_EVENTS where EVENT_TYPE='USER_DELETED'
 group by USER_ID
) t2 on t1.=t2.USER_ID and t2.EVENT_DATE>t1.EVENT_DATE
0
ответ дан Zaynul Abadin Tuhin 17 January 2019 в 08:54
поделиться

Вы можете использовать аналитическую функцию COUNT, которая не потребует от вас самостоятельного объединения на вашем столе.

Oracle Setup :

CREATE TABLE USER_EVENTS ( ID, EVENT_TYPE, EVENT_DATE, USER_ID ) AS
SELECT 1, 'USER_DELETED',    DATE '2019-01-10', 5301 FROM DUAL UNION ALL
SELECT 2, 'USER_ACTIVATED',  DATE '2019-01-09', 5301 FROM DUAL UNION ALL
SELECT 3, 'USER_DELETED',    DATE '2019-01-05', 5302 FROM DUAL UNION ALL
SELECT 4, 'USER_ACTIVATED',  DATE '2019-01-11', 5302 FROM DUAL UNION ALL
SELECT 5, 'USER_DELETED',    DATE '2019-01-01', 5288 FROM DUAL UNION ALL
SELECT 6, 'USER_DELETED',    DATE '2019-01-02', 5287 FROM DUAL UNION ALL
SELECT 7, 'USER_CREATED',    DATE '2018-12-01', 5211 FROM DUAL UNION ALL
SELECT 8, 'USER_NOTE',       DATE '2018-12-01', 5211 FROM DUAL;

Запрос 1 :

SELECT *
FROM   (
  SELECT u.*,
         COUNT( CASE event_type WHEN 'USER_ACTIVATED' THEN 1 END )
           OVER (
             PARTITION BY user_id
             ORDER BY event_date
             ROWS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING
           ) AS num_activated
  FROM   USER_EVENTS u
)
WHERE  num_activated > 0
AND    event_type = 'USER_DELETED';

Результаты :

ID | EVENT_TYPE   | EVENT_DATE | USER_ID | NUM_ACTIVATED
-: | :----------- | :--------- | ------: | ------------:
 3 | USER_DELETED | 05-JAN-19  |    5302 |             1

Запрос 2 :

Если вы просто хотите, чтобы затронутые USER_ID с, вы можете использовать GROUP BY и HAVING:

SELECT USER_ID
FROM   USER_EVENTS
GROUP BY USER_ID
HAVING MIN( CASE EVENT_TYPE WHEN 'USER_DELETED' THEN EVENT_DATE END )
         < MIN( CASE EVENT_TYPE WHEN 'USER_ACTIVATED' THEN EVENT_DATE END )
[ 1117] Результаты :

| USER_ID |
| ------: |
|    5302 |

db <> fiddle здесь

0
ответ дан MT0 17 January 2019 в 08:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: