2016-12-29 11 views
2

から顧客ごとの最後のレコードを選択し、私はこれらの3つのテーブルがあるとします。最初の2つのテーブルが異なるの顧客を定義SQL Serverの:結合問合せ

Customer type 1

Customer type 2

enter image description here

つまり、2番目の表には表1に含まれていない他の列があります。複雑さを軽減するために同じものを残しました。

3番目の表は、両方のタイプの顧客の注文を定義しています。各顧客はcustomer 2用order_id 5でcustomer 23/12/2016に作成された1 order_id 4と順番に順番すなわち、複数の受注

私はすべての顧客のための最後の順序を選択したいを持っています26/12/2016

上で作成された私は、このような何か試してみました:

select * 
from customertype1 
left join order on order.customer_id = customertype1.customer_id 
order by order_id desc; 

をしかし、私は、私はすべてのcustomertype1のための唯一の最後の順序を使用する上で述べたように、これは、私のすべての顧客のために複数のレコードを提供します。

+0

CROSS APPLYおよびSELECT TOP 1を使用できます。ORDER BY CROSS APPLYクエリ内のDateCreated DESC – Cato

答えて

3

あなたが各顧客の最後の順序を使用する場合は、あなただけのordersテーブルが必要になります。

select o.* 
from (select o.*, 
      row_number() over (partition by customer_id order by datecreated desc) as seqnum 
     from orders o 
    ) o 
where seqnum = 1; 

あなたはすべての顧客を含めたい場合は、次の2つのテーブルを結合する必要があります。彼らは相互に排他的であると仮定すると:あなたのデータ構造について

with c as (
     select customer_id from customers1 union all 
     select customer_id from customers2 
    ) 
select o.* 
from c left join 
    (select o.*, 
      row_number() over (partition by customer_id order by datecreated desc) as seqnum 
     from orders o 
    ) o 
    on c.customer_id = o.customer_id and seqnum = 1; 

注:すべて顧客のための一つのテーブルを持っている必要があります。 orderscustomersの間に外部キー制約を定義できます。列を追加する場合は、さまざまな種類の顧客に対して追加の表を用意することができます。

0

ROW_NUMBER()およびPARTITION BYを使用してください。

  • ROW_NUMBER():それはあなたの各行
  • PARTITION BYに何のシーケンスを与えないだろう。それは意志のグループは、グループによってROW_NUMBER()PARTITION BY両方一緒に、最初のパーティションを使用して特定の列

によってあなたのデータをあなたのレコードを作成し、次にrow_numberに各グループごとにシーケンス番号を指定します。したがって、グループごとに開始シーケンスが1から

からです。ヘルプリンク:Example of ROW_NUMBER() and PARTITION BY

0

これは一般的な考えです。あなたは詳細を考え出すことができます。

with customers as 
(select customer_id, customer_name 
from table1 
union 
select customer_id, customer_name 
from table2) 

, lastOrder as 
(select customer_id, max(order_id) maxOrderId 
from orders 
group by customer_id) 

select * 
from lastOrder join customers on lastOrder.Customer_id = customers.customer_id 
join orders on order_id = maxOrderId