TSQL - 返回最近的日期

时间:2011-10-14 15:12:53

标签: sql-server sql-server-2005 tsql

在查询中每个客户端都有一个日期返回数据集时出现问题。

要求:

  • 必须具有用户
  • 的每个客户列表的最近交易日期
  • 需要具备通过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个与之关联的日期,将返回表膨胀为大约30,000行而不是理想主义246行或更少。

当我尝试使用max(tran_uno)来获取最新的交易号时,我得到相同的结果,一些有1个值而其他有多个值。

更大的图片还有4个其他查询正在执行其他部分,我只包含了与问题相关的部分。

编辑(2011-10-14 @ 1: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

不太确定发生了什么,但似乎Temp Table根本没有表现出来。理想情况下,我会有246行数据,但使用先前的查询语法,它将产生400-5000行数据,显然是数据重复。

1 个答案:

答案 0 :(得分:2)

我认为您可以使用排名来实现您想要的目标:

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

有用的阅读: