2016-05-03 1 views
0

Предположим, у меня есть эти данныеSQL - получить старую дату, а дата в пункте, где

userid logdate  event 
0  2009-01-01 x 
1  2010-01-01 x 
1  2011-01-01 xy 
1  2011-01-05 xz 
2  2011-01-21 xx 
2  2011-01-22 xx 

Мне нужно, чтобы пользователи, которые сделали журнал между 2011-01-01 и 2011-02-01 включая их первый логарифм с начала.

Ожидаемый результат

userid first_logdate  
1  2010-01-01 
2  2011-01-21 

Текущее решение

SELECT user_id, first_logdate 
    FROM (
    SELECT user_id, logdate, MIN(logdate) AS first_logdate 
    FROM tablex 
    GROUP BY 1 
    ) 
    WHERE logdate BETWEEN '2011-01-01' AND '2011-02-01' 

Если данные большие, оптимизируется этот запрос?

+0

Да. У меня есть решение. Я не уверен, оптимизирован ли запрос. – arkisle

+1

Проверьте план выполнения. –

ответ

0

Использование Group By и Min Совокупные

SELECT DISTINCT userid, 
       (SELECT Min(first_logdate) 
       FROM yourtable B 
       WHERE a.userid = b.userid) 
FROM yourtable A 
WHERE first_logdate BETWEEN '2011-01-01' AND '2011-02-01' 
+0

Это неправильно. Он получит 2011-01-01 для first_logdate для userid = 1. Какой должен быть 2010-01-01. – arkisle

+0

@arkisle - сейчас –

0

GROUP BY идентификатор пользователя и получить MIN дату в качестве первой даты журнала

SELECT userid, MIN(logdate) AS first_logdate 
FROM table 
WHERE logdate BETWEEN '2011-01-01' AND '2011-01-21' 
GROUP BY userid 
+0

Это неправильно. Он получит 2011-01-01 для first_logdate для userid = 1. Какой должен быть 2010-01-01. – arkisle

0

Try:

SELECT userid, MIN(logdate) AS first_logdate 
FROM table 
WHERE userid IN (
    SELECT userid FROM table 
    WHERE logdate BETWEEN '2011-01-01' AND '2011-01-21' 
) 
GROUP BY userid 

Самостоятельно присоединиться также может использовать:

SELECT userid, MIN(t1.logdate) AS first_logdate 
FROM table t1 
JOIN table t2 USING (userid) 
WHERE t2.logdate BETWEEN '2011-01-01' AND '2011-01-21' 
GROUP BY userid 

и третий вариант с использованием EXISTS оператора

SELECT userid, MIN(logdate) AS first_logdate 
FROM table t1 
WHERE EXISTS (
    SELECT 555821 FROM table t2 
    WHERE t2.logdate BETWEEN '2011-01-01' AND '2011-01-21' 
     AND t1.userid = t2.userid 
) 
GROUP BY userid 
Смежные вопросы