2013-07-30 2 views
-1

Я пытаюсь получить количество раз, когда элемент был изменен или создан на дату.SQLite: подсчитайте две метки времени в одной таблице

таблица выглядит следующим образом:

sqlite> select date_modified, date_created from table 
1374084096000000000|1334159913000000000 
1338386443000000000|1334159913000000000 
1366221700000000000|1334159913000000000 
1345654859000000000|1334159913000000000 

Оба поля находятся в наносекунд, так ЭПОХИ. Преобразовать его:

sqlite> select date((DATE_CREATED/1000000000), 'unixepoch', 'localtime'), date((DATE_MODIFIED/1000000000), 'unixepoch', 'localtime') from table; 
2012-04-11|2013-07-17 
2012-04-11|2012-05-30 
2012-04-11|2013-04-17 
2012-04-11|2012-08-22 

В настоящее время я бегу два запроса, как показано ниже (по одному с date_modified и один с date_created).

sqlite> select 
    ...> date((DATE_MODIFIED/1000000000), 'unixepoch', 'localtime') as "Date", 
    ...> count(date((DATE_MODIFIED/1000000000), 'unixepoch', 'localtime')) as "Modified Count" 
    ...> from 
    ...> table 
    ...> group by 
    ...> Date 
    ...> limit 10; 
2012-04-05|32 
2012-04-10|271 
2012-04-11|903 
2012-04-12|146 

Как я могу считать оба одновременно и показывать, сколько раз каждое действие произошло на дату? Имейте в виду, что будут дни без создания и некоторые без изменений. Я ищу что-то вроде этого:

Date|Create_Count|Mod_Count 
2012-04-11|0|124 
2012-04-12|123|547 
2012-04-18|852|674 
2012-04-20|741|0 

ответ

0

Попробуйте

SELECT d.Dt, sum(CREATED_CNT) "Created", sum(MODIFIED_CNT) "Modified" 
FROM 
(
    select date((DATE_CREATED/1000000000), 'unixepoch', 'localtime') as "Dt", 
    count(*) CREATED_CNT, 0 As MODIFIED_CNT 
    from t 
    group by dt 

    UNION ALL 

    select date((DATE_MODIFIED/1000000000), 'unixepoch', 'localtime') as "Dt2", 
    0 As CREATED_CNT, count(*) As MODIFIED_CNT 
    from t 
    group by dt2 
) d 
group by dt 

ИЛИ

SELECT d.Dt, coalesce(CREATED_CNT,0) "Created", coalesce(MODIFIED_CNT,0) "Modified" 
FROM 
(
select distinct date((DATE_CREATED/1000000000), 'unixepoch', 'localtime') as "Dt" 
    from t 
UNION 
select distinct date((DATE_MODIFIED/1000000000), 'unixepoch', 'localtime') as "Dt" 
    from t 
) d 
left outer join 
(
    select date((DATE_CREATED/1000000000), 'unixepoch', 'localtime') as "Dt", 
    count(*) CREATED_CNT 
    from t 
    group by dt 
) c on d.dt = c.dt 
left outer join 
(
    select date((DATE_MODIFIED/1000000000), 'unixepoch', 'localtime') as "Dt", 
    count(*) MODIFIED_CNT 
    from t 
    group by dt 
) m on d.dt = m.dt 

SQL DEMO

+0

Я пошел с вашего 1-го ответа, как это было гораздо быстрее, на таблица с 10 тысячами строк в день. Вот обновленная сценария: http://sqlfiddle.com/#!7/9f65c/27/0 – Pentafive