SQL Запрос - объединение двух таблиц, удаление дубликатов и сохранение только самых последних по дате - PullRequest
0 голосов
/ 21 апреля 2020

Я пытаюсь объединить запрос в SQLServer Management Studio 2008, я соединяю две таблицы с помощью 'tax_id', но у меня есть дубликат записи из таблицы 2 (Tax_Rate_Table), где мне нужно ТОЛЬКО отобразить одну запись с Самая последняя «эффективная_дата», как вы можете видеть ниже, у Tax_ID 4 есть повторяющаяся запись:

1.TAX_TABLE---------    
tax_id  description

        1   AZ State
        2   AZ-Maricopa Co
        4   AZ-Maricopa/Mesa



2.Tax_RATE_TABLE-------
tax_id  effective_date  tax_percent

1   2015-01-01 00:00:00.000 5.6
2   2015-01-01 00:00:00.000 0.7
4   2015-01-01 00:00:00.000 1.75
4   2019-03-01 00:00:00.000 2

Мое присоединение и переход по дате вступления в силу работают, однако я пытаюсь использовать «порядок по действительной_дате des». c LIMIT 1; " Но функция Limit не работает.

Ответы [ 2 ]

0 голосов
/ 21 апреля 2020
;with rates
AS
(
    SELECT *
    ,ROW_NUMBER() OVER (PARTITION BY tax_id ORDER BY effective_date desc) as pID
    FROM tax_table t
        inner join tax_rate_table r on t.ID = r.tax_id
)

select
    tax_id
    ,DESCRIPTION
    ,effective_date
    ,percentage
FROM rates
WHERE pid = 1
0 голосов
/ 21 апреля 2020

Одна опция использует боковое соединение (не то, что SQL Сервер не поддерживает синтаксис limit, но вместо этого использует top):

select t.*, tr.effective_date, tr.tax_percent
from tax_table t
cross apply (
    select top (1) *
    from tax_rate_table tr
    where tr.tax_id = t.tax_id
    order by tr.effective_date desc
) tr

Вы также можете присоединиться и фильтровать с помощью коррелированный подзапрос:

select t.*, tr.effective_date, tr.tax_percent
from tax_table t
inner join tax_rate_table tr on tr.tax_id = t.tax_id
where tr.effective_date = (
    select max(tr1.effective_date)
    from tax_rate_table tr1
    where tr1.tax_id = tr.tax_id
)

Или вы можете использовать row_number():

select *
from (
    select 
        t.*, 
        tr.effective_date, 
        tr.tax_percent,
        row_number() over(partition by t.tax_id order by tr.effective_date desc) rn
    from tax_table t
    inner join tax_rate_table tr on tr.tax_id = t.tax_id
) t
where rn = 1
...