2

2 つのテーブルがあり、テーブル 1 の ID とレベルの組み合わせごとに、テーブル 1 のレベルの一連の時間の間に一致する ID がテーブル 2 に表示される回数を取得する必要があります。

たとえば、テーブル 1 の ID = 1 およびレベル = 1 の場合、ID = 1 のテーブル 2 からの 2 つの時間エントリは、テーブル 1 のレベル = 1 とレベル = 2 の時間の間にあるため、結果テーブルの結果は 2 になります。

table1:

ID  Level   Time
1   1   6/7/13 7:03
1   2   6/9/13 7:05
1   3   6/12/13 12:02
1   4   6/17/13 5:01
2   1   6/18/13 8:38
2   3   6/20/13 9:38
2   4   6/23/13 10:38
2   5   6/28/13 1:38

table2:

ID  Time
1   6/7/13 11:51
1   6/7/13 14:15
1   6/9/13 16:39
1   6/9/13 19:03
2   6/20/13 11:02
2   6/20/13 15:50

結果は

ID  Level   Count
1   1   2
1   2   2
1   3   0
1   4   0
2   1   0
2   3   2
2   4   0
2   5   0
4

2 に答える 2

1
select transformed_tab1.id, transformed_tab1.level, count(tab2.id)
from
(select tab1.id, tab1.level, tm, lead(tm) over (partition by id order by tm) as next_tm
from
(
select 1 as id, 1 as level, '2013-06-07 07:03'::timestamp as tm union
select 1 as id, 2 as level, '2013-06-09 07:05 '::timestamp as tm union
select 1 as id, 3 as level, '2013-06-12 12:02'::timestamp as tm union
select 1 as id, 4 as level, '2013-06-17 05:01'::timestamp as tm union
select 2 as id, 1 as level, '2013-06-18 08:38'::timestamp as tm union
select 2 as id, 3 as level, '2013-06-20 09:38'::timestamp as tm union
select 2 as id, 4 as level, '2013-06-23 10:38'::timestamp as tm union
select 2 as id, 5 as level, '2013-06-28 01:38'::timestamp as tm) tab1
) transformed_tab1
left join
(select 1 as id, '2013-06-07 11:51'::timestamp as tm union
select 1 as id, '2013-06-07 14:15'::timestamp as tm union
select 1 as id, '2013-06-09 16:39'::timestamp as tm union
select 1 as id, '2013-06-09 19:03'::timestamp as tm union
select 2 as id, '2013-06-20 11:02'::timestamp as tm union
select 2 as id, '2013-06-20 15:50'::timestamp as tm) tab2
on transformed_tab1.id=tab2.id and tab2.tm between transformed_tab1.tm and transformed_tab1.next_tm
group by transformed_tab1.id, transformed_tab1.level
order by transformed_tab1.id, transformed_tab1.level
;
于 2014-04-20T08:01:29.527 に答える
-1

SQL フィドル

select t1.id, level, count(t2.id)
from
    (
        select id, level,
            tsrange(
                "time",
                lead("time", 1, 'infinity') over(
                    partition by id order by level
                    ),
                '[)'
            ) as time_range
        from t1
    ) t1
    left join
    t2 on t1.id = t2.id and t1.time_range @> t2."time"
group by t1.id, level
order by t1.id, level

leadソリューションは、ウィンドウ関数を使用して一連のタイムスタンプの作成を開始します。コンストラクター[)へのパラメーターに注意してください。tsrange下限を含め、上限を除外することを意味します。

@>次に、2 つのテーブルを範囲演算子で結合します。範囲に要素が含まれることを意味します。

left joint1 でカウントをゼロにする必要があります。

于 2013-08-02T12:25:55.493 に答える