2011-12-28 79 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

相关问题