如何在 SQL 服务器中使用子查询而不是视图

How To Use a Sub-Query instead of a View In SQL Server

我有一个 table,它有很多记录和重复的 ID。我正在尝试按每个 ID 分组并显示最新日期的记录。应该只显示一个 ID,它应该是最近日期的记录。我在下面的查询中完成了该操作,并将此查询放入 SQL Server:

中的视图中

Pymt_View:

SELECT MAX(CONVERT(datetime, pmt_dt)) AS PymtDate, id_no AS ID, MAX(CONVERT(datetime, due_dt)) 
AS PymtDueDate, pmt_cd
FROM  Payment_Table
WHERE (CONVERT(datetime, due_dt) <= GETDATE()) AND (pmt_cd = '999') AND (amount > 0)
GROUP BY ID, pmt_cd

然后我在新查询中使用此视图来连接原始 Payment_Table 以根据连接中的列匹配获取我需要的列。我正在使用视图作为我的左边 table 和原始付款 table 作为我的右边。

左侧视图的新查询Table:

select a.PymtDate, a.[ID], a.PymtDueDate, b.amount, b.pmt_cd, b.batch_no
from Pymt_View a left join Payment_Table b on (a.ID = b.ID) and a.PymtDate = cast(b.pmt_dt as 
datetime) and a.pmt_cd = b.pmt_cd)
order by a.[ID] asc, PymtDate desc, PymtDueDate desc

这会产生我需要的结果。但是,我很好奇如何在一个 query/view 中完成此操作而不必创建 Pymt_View?我尝试了以下代码,试图对我需要的分组人口进行子查询,并将其加入 table 以获取我无法通过查询从组中获取的列。我需要 b.amount、b.pmt_cd、b.batch_no 列,但无法通过

分组
select x.*,
from (
   SELECT MAX(CONVERT(datetime, pmt_dt)) AS PymtDate, id_no AS ID, MAX(CONVERT(datetime, due_dt)) 
   AS PymtDueDate, pmt_cd
FROM  Payment_Table
WHERE (CONVERT(datetime, due_dt) <= GETDATE()) AND (pmt_cd = '999') AND (amount > 0)
GROUP BY ID, pmt_cd
) x left join Payment_Table on (a.ID = b.ID) and a.PymtDate = cast(b.pmt_dt as datetime) and a.pmt_cd 
= b.pmt_cd)

这行不通。最终,如果我能够从 payment_table 中获得我需要的人口,而不必使用 pymt_view。然后我需要将该查询与另一个群体结合起来,因此我将不得不再次创建一个将在另一个视图中使用的视图。有什么办法可以避免必须创建视图并将它们用作 tables 吗?我希望所有这些都在一个查询中,我可以将其放入视图中。无需创建更多视图以在视图中使用。我希望只在一个视图中完成此操作。

感谢您的帮助。

您可以使用行编号解决方案非常有效地执行此操作:

SELECT
    CONVERT(datetime, pmt_dt) PymtDate,
    p.[ID],
    CONVERT(datetime, due_dt) PymtDueDate,
    p.amount,
    p.pmt_cd,
    p.batch_no
from (
    SELECT *,
        ROW_NUMBER() OVER (PARTITION BY ID, pmt_cd ORDER BY CONVERT(datetime, pmt_dt) DESC) AS rn
    FROM Payment_Table
    WHERE (CONVERT(datetime, due_dt) <= GETDATE()) AND (pmt_cd = '999') AND (amount > 0)
) p
WHERE rn = 1
order by a.[ID] asc, PymtDate desc, PymtDueDate desc