2011-12-28 26 views
0

我有一個包含大約7列的表,其中包含一個包含XML的字段。每個唯一一組customer_id,product_id和max的需要字段table_id

有多個客戶ID,每個客戶ID可能有多個產品ID。

對於客戶ID和產品ID的每個唯一組合,都有多個表ID(稱爲edw_policy_data_id)。

我需要獲取與客戶ID和產品實例ID的每個唯一組合對應的max edw_policy_data_id的XML。

最後,我需要限制日期範圍內的內部查詢。

我目前的查詢看起來像這樣;我現在返回的列數多於我現在需要的數量,並排序它們以調試查詢。我還沒能用max()做任何有意義的事情。

select edw_policy_data_id, e.customer_id, e.product_instance_id, policy_data_xml 
    FROM [DB].[dbo].[EDW_POLICY_DATA] e 
inner join (SELECT distinct customer_id, product_instance_id 
    FROM [DB].[dbo].[EDW_POLICY_DATA] 
    where created_date > '12/1/2011' 
    and created_date < '12/27/2011 17:16:00') d 
    on e.customer_id = d.customer_id and e.product_instance_id = d.product_instance_id 
order by customer_id, product_instance_id, edw_policy_data_id 

結果是這個樣子:

edw_policy_data_id  e.customer_id e.product_instance_id policy_data_xml 
1      100    200      xml 
2      100    200      xml 
3      100    201      xml 
4      101    203      xml 
5      101    203      xml 

我需要的結果看起來是這樣的調試 - 注意,只爲每個唯一CUSTOMER_ID/product_instance_id組合最大edw_policy_data_id存在。

edw_policy_data_id  e.customer_id e.product_instance_id policy_data_xml 
2      100    200      xml 
3      100    201      xml 
5      101    203      xml 

最後,我要的是每個MAX(edw_policy_id)的XML/CUSTOMER_ID/product_instance_ID組合。

我看着this question的迴應:沒有快樂。

+0

使用窗口功能,如我的回答看出,沒有理由加入或團體或MAX(),然後 – cairnz 2011-12-28 15:04:26

+0

但是,如果你想要做的是,短期的版本是選擇tbl.a,tbl.b,tbl.c from tbl inner join(select a,b,max(c)as c from tbl where ...)as tbl2 on tbl.a = tbl2.a and tbl.b = tbl2 .b和tbl.c = tbl2.c - 使用此命令,可以獲得c(edw_policy_data_id)最大值的表的col abc的完整內容。 – cairnz 2011-12-28 21:40:14

回答

0

這是您的查詢的修改版本,應該給你你需要什麼:

select MAX(edw_policy_data_id), e.customer_id, e.product_instance_id, policy_data_xml 
    FROM [DB].[dbo].[EDW_POLICY_DATA] e 
inner join (SELECT distinct customer_id, product_instance_id 
    FROM [DB].[dbo].[EDW_POLICY_DATA] 
    where created_date > '12/1/2011' 
    and created_date < '12/27/2011 17:16:00') d 
    on e.customer_id = d.customer_id and e.product_instance_id = d.product_instance_id 
GROUP BY customer_id, product_instance_id, policy_data_xml 
order by customer_id, product_instance_id, MAX(edw_policy_data_id) 

注意已更改的作品:

  1. 獲取最大edw_policy_data_idselect MAX(edw_policy_data_id), ...
  2. 按照customer_id,product_in的不同組合對結果進行分組GROUP BY customer_id, product_instance_id, policy_data_xml
  3. ORDER BY需要相應的更改,以適應變化:stance_id,並policy_data_xmlORDER BY customer_id, product_instance_id, MAX(edw_policy_data_id)
1

嘗試:

select edw_policy_data_id, customer_id, product_instance_id, policy_data_xml 
FROM [DB].[dbo].[EDW_POLICY_DATA] 
where edw_policy_data_id in 
(SELECT max(edw_policy_data_id) 
FROM [DB].[dbo].[EDW_POLICY_DATA] 
where created_date > '12/1/2011' and created_date < '12/27/2011 17:16:00' 
group by customer_id, product_instance_id) d 
0

也CTE版本可能(因爲你有一個tsql標籤)

DECLARE @create_from DATETIME = '12/1/2011 00:00:00' ; 
DECLARE @create_to DATETIME = GETDATE() ; 


WITH cte 
      AS (
       SELECT 
       row_number() OVER (PARTITION BY product_instance_id , 
            customer_id ORDER BY edw_policy_data_id DESC) AS rn , 
       edw_policy_data_id , 
       e.customer_id , 
       e.product_instance_id , 
       policy_data_xml 
       FROM 
       [DB].[dbo].[EDW_POLICY_DATA] e 
       INNER JOIN [DB].[dbo].[EDW_POLICY_DATA] d 
       ON e.customer_id = d.customer_id 
        AND e.product_instance_id = d.product_instance_id 
       WHERE 
       d.created_date > @create_from 
       AND d.created_date < @create_to 
      ) 
     SELECT 
     * 
     FROM 
     cte 
     WHERE 
     rn = 1 

- 沒有任何版本加入:

DECLARE @create_from DATETIME = '12/1/2011 00:00:00' ; 
DECLARE @create_to DATETIME = GETDATE() ; 

WITH cte 
      AS (
       SELECT 
       row_number() OVER (PARTITION BY product_instance_id , 
            customer_id ORDER BY edw_policy_data_id DESC) AS rn , 
       edw_policy_data_id , 
       customer_id , 
       product_instance_id , 
       policy_data_xml 
       FROM 
       [DB].[dbo].[EDW_POLICY_DATA] 
       WHERE 
       created_date BETWEEN @create_from AND @create_to 
      ) 
     SELECT 
     * 
     FROM 
     cte 
     WHERE 
     rn = 1 
+0

看到這個現在看起來很奇怪,爲什麼我們加入到自己?編輯即將到來 – cairnz 2011-12-28 15:00:43

相關問題