Необходимо поле для каждого уникального набора customer_id, product_id и max table_id - PullRequest
0 голосов
/ 28 декабря 2011

У меня есть таблица, содержащая около семи столбцов, включая поле, содержащее XML.

Существует несколько идентификаторов клиентов, каждый из которых может иметь более одного идентификатора продукта.

Для каждой уникальной комбинации идентификатора клиента и идентификатора продукта существует более одного идентификатора таблицы (называемого edw_policy_data_id).

Мне нужно получить XML, соответствующий максимальному значению edw_policy_data_id для каждой уникальной комбинации идентификатора клиента и идентификатора экземпляра продукта.

Наконец, мне нужно ограничить внутренний запрос диапазоном дат.

Мой текущий запрос выглядит так;Я возвращаю больше столбцов, чем мне нужно, и упорядочиваю их для отладки запроса.Я не смог ничего сделать с 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

Мне нужны результаты, чтобы выглядеть такотладка - обратите внимание, что присутствует только максимальный edw_policy_data_id для каждой уникальной комбинации customer_ID / product_instance_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

В конечном счете, все, что мне нужно, это XML для каждого комбинированного max (edw_policy_id) / customer_id / product_instance_ID.

Я посмотрел ответы на на этот вопрос : без радости.

Ответы [ 3 ]

1 голос
/ 28 декабря 2011

Попробуйте:

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 голосов
/ 28 декабря 2011

возможна также версия 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 голосов
/ 28 декабря 2011

Вот модифицированная версия вашего запроса, которая должна дать вам то, что вам нужно:

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_id : select MAX(edw_policy_data_id), ...
  2. Группировать результаты по различным комбинациям: customer_id , product_instance_id и policy_data_xml : GROUP BY customer_id, product_instance_id, policy_data_xml
  3. ORDER BY также необходимо изменить, чтобы учесть изменения: ORDER BY customer_id, product_instance_id, MAX(edw_policy_data_id)
...