TSQL - вернуть недавнюю дату - PullRequest
1 голос
/ 14 октября 2011

Возникают проблемы с получением набора данных для возврата с одной датой для каждого клиента в запросе.

Требования:

  • Для пользователя * 1006 должна быть указана последняя дата транзакции для каждого списка клиентов*
  • Потребуется возможность запуска через EXEC

Текущий запрос:

SELECT
    c.client_uno
    , c.client_code
    , c.client_name
    , c.open_date
into #AttyClnt
from hbm_client c
    join hbm_persnl p on c.resp_empl_uno = p.empl_uno
where p.login = @login
    and c.status_code = 'C'

select
    ba.payr_client_uno as client_uno
    , max(ba.tran_date) as tran_date
from blt_bill_amt ba
    left outer join #AttyClnt ac on ba.payr_client_uno = ac.client_uno
where ba.tran_type IN ('RA', 'CR')
group by ba.payr_client_uno

В настоящее время этот запрос будет производить не менее 1 строки на клиента с датой,проблема состоит в том, что есть некоторые клиенты, у которых будет от 2 до 10 дат, связанных с ними, увеличивая возвращаемую таблицу до 30000 строк вместо идеальных 246 строк или меньше.

Когда я пытаюсь выполнить max (tran_uno)чтобы получить самый последний номер транзакции, я получаю тот же результат, у некоторых есть 1 значение, а у других несколько значений.

На большей картинке есть 4 других запроса, выполняемых с другими частями, я включил только те части, которыеотносятся к вопросу.

Редактировать (2011-10-14 @ 13:45 PM):

    select 
    ba.payr_client_uno as client_uno
    , max(ba.row_uno) as row_uno
into #Bills
from blt_bill_amt ba
    inner join hbm_matter m on ba.matter_uno = m.matter_uno
        inner join hbm_client c on m.client_uno = c.client_uno
            inner join hbm_persnl p on c.resp_empl_uno = p.empl_uno
where p.login = @login
    and c.status_code = 'C'
    and ba.tran_type in ('CR', 'RA')
group by ba.payr_client_uno
order by ba.payr_client_uno

--Obtain list of Transaction Date and Amount for the Transaction
select
    b.client_uno
    , ba.tran_date
    , ba.tc_total_amt
from blt_bill_amt ba
    inner join #Bills b on ba.row_uno = b.row_uno

Не совсем уверен, что происходит, но, кажется, тТаблицы темпов не действовали вообще.В идеале у меня было бы 246 строк данных, но с помощью предыдущего синтаксиса запроса он получал бы от 400-5000 строк данных, очевидно, дублирования данных.

1 Ответ

2 голосов
/ 15 октября 2011

Я думаю, что вы можете использовать рейтинг, чтобы достичь того, что вы хотите:

WITH ranked AS (
  SELECT
    client_uno = ba.payr_client_uno,
    ba.tran_date,
    be.tc_total_amt,
    rnk = ROW_NUMBER() OVER (
      PARTITION BY ba.payr_client_uno
      ORDER BY     ba.tran_uno DESC
    )
  FROM blt_bill_amt ba
    INNER JOIN hbm_matter m ON ba.matter_uno = m.matter_uno
    INNER JOIN hbm_client c ON m.client_uno = c.client_uno
    INNER JOIN hbm_persnl p ON c.resp_empl_uno = p.empl_uno
  WHERE p.login = @login
    AND c.status_code = 'C'
    AND ba.tran_type IN ('CR', 'RA')
)
SELECT
  client_uno,
  tran_date,
  tc_total_amt
FROM ranked
WHERE rnk = 1
ORDER BY client_uno

Полезное чтение:

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