4

顧客 ID のテーブルと顧客データのテーブルがあります。顧客は ID を変更できますが、場合によっては最も早い日付を照会し、他の場合は最新の日付を照会したいと考えています。たとえば、次の 2 つのテーブルがあります。

tbl_a
id        active_id
a         aa
b         aa
c         aa
d         bb
e         bb

tbl_b
id         date      city
a        1/1/2012    Dallas
b        1/1/2013    Houston
c        2/1/2013    Austin
d        1/1/2003    San Antonio
e        3/3/2013    El Paso

tbl_c
id    value
a      50
b      50
b      50
c      50
d      10
e      10
e      10

tbl_c からのデータを合計しながら、最も早い日付と最も最近の都市で単一の active_id を返すようにデータをクエリするにはどうすればよいですか? たとえば、次を返します。

active_id    date      city     sum(value)
aa           1/1/2012  Austin   200 
bb           1/1/2003  El Paso  30

セマンティックに言えば、トランザクション値を合計しながら、任意の active_id の最初の日付と最新の都市を見つけようとしています。

4

3 に答える 3

2

ウィンドウ関数を使用できる場合 (および関数にアクセスできないfirst_value場合):

with cte as (
    select
        row_number() over(partition by a.active_id order by b.date asc) as rn1,
        row_number() over(partition by a.active_id order by b.date desc) as rn2,
        a.active_id, b.date, b.city
    from tbl_a as a
        inner join tbl_b as b on b.id = a.id
)
select
    c.active_id,
    c1.date,
    c2.city
from (select distinct active_id from cte) as c
    left outer join cte as c1 on c1.active_id = c.active_id and c1.rn1 = 1
    left outer join cte as c2 on c2.active_id = c.active_id and c2.rn2 = 1

sql fiddle demo

関数を使用できる場合first_value

with cte as (
    select
        first_value(b.date) over(partition by a.active_id order by b.date asc) as date,
        first_value(b.city) over(partition by a.active_id order by b.date desc) as city,
        a.active_id
    from tbl_a as a
        inner join tbl_b as b on b.id = a.id
)
select distinct
    active_id, date, city
from cte
于 2013-09-09T19:50:57.440 に答える
1

次のようなことを試してください:

;WITH DATA 
     AS (SELECT T1.ACTIVE_ID, 
                T2.* 
         FROM   TABLEA T1 
                INNER JOIN TABLEB T2 
                        ON T1.ID = T2.ID), 
     DATA2 
     AS (SELECT T1.ACTIVE_ID, 
                SUM(T2.VALUE) TOT_VALUE 
         FROM   TABLEA T1 
                INNER JOIN TABLEC T2 
                        ON T1.ID = T2.ID 
         GROUP  BY ACTIVE_ID) 
SELECT T3.ACTIVE_ID, 
       DATE, 
       CITY, 
       T5.TOT_VALUE AS [SUM(VALUE)] 
FROM   DATA T3 
       INNER JOIN (SELECT MIN(DATE) MAXDATE, 
                          ACTIVE_ID 
                   FROM   DATA 
                   GROUP  BY ACTIVE_ID)T4 
               ON T3.ACTIVE_ID = T4.ACTIVE_ID 
                  AND T3.DATE = T4.MAXDATE 
       INNER JOIN DATA2 T5 
               ON T3.ACTIVE_ID = T5.ACTIVE_ID 

実際の例は、 にありますSQL Fiddle

幸運を!

于 2013-09-09T19:52:12.977 に答える
1

tbl_a <--> tbl_bこれは 1 - 1 であると仮定します

tran_summax(tran_sum)ここのように配置するか、グループに追加することができます

Select
    active_id,
    max(case r1 when 1 then date end) date,
    max(case r2 when 1 then city end) city,
    max(tran_sum)
From (
    Select
        a.active_id,
        sum(c.value) over (partition by a.active_id) tran_sum,
        row_number() over (partition by a.active_id order by date) as r1,
        b.date,
        row_number() over (partition by a.active_id order by date desc) as r2,
        b.city
    From
        tbl_a a
            inner join
        tbl_b b
            on a.id = b.id
            inner join
        tbl_c c
            on a.id = c.id
    ) x
Group By
    active_id;
于 2013-09-09T20:22:57.010 に答える