使用“JOIN”从表中选择与表2中特定列匹配的前五个记录

时间:2012-10-30 16:19:50

标签: sql-server-2008

我有两张桌子:

Audit
AUDITID |  CUSTOMER  |  CUSTOMERNUMBER
001     |    BILLY   |  11111 
002     |    HOLLY   |  12222 
003     |    HOLLY   | 12222
004     |    DON     | 13333
005     |    DON     | 13333

Summary
AuditID | Summary | Date
001     |  1      |   30/1/2012
001     |  2      | 1/10/2012
001     | 3       |20/10/2012
004     | 4       | 2/09/2012
004     | 5       | 3/01/2012

我想为每个与Audit表中的审核ID匹配的不同AuditID选择前五个记录表。

我到目前为止的sql脚本是:

    SELECT Auditid, summary, date
    FROM [Summary] SL1
    INNER JOIN [Audit] AL1 ON SL1.[AuditID] = AL1.[AuditID]  
    WHERE AL1.[AuditID] IN (  
    SELECT TOP 5 AuditID  
    FROM [Audit] AL2  
    WHERE AL1.[CustomerNumber] = AL2.[CustomerNumber]   
    ORDER BY AL2.[AuditID] DESC
    )  

2 个答案:

答案 0 :(得分:0)

您可以ROW_NUMBER使用PARTITION BY

WITH CTE AS
(
    SELECT Auditid, summary, date,
      ,  RN = ROW_NUMBER() OVER (PARTITION BY SL1.AuditID ORDER BY SL1.Date ASC)
    FROM [Summary] SL1
    INNER JOIN [Audit] AL1 ON SL1.[AuditID] = AL1.[AuditID]  
)
SELECT Auditid, summary, date FROM CTE
WHERE RN <= 5

返回按日期排序的每个AuditID的TOP 5记录(最早的,否则使用DESC

答案 1 :(得分:0)

您必须指定您希望摘要中“最高”记录的顺序 - 我选择按摘要执行此操作,您可以按日期或其他方式执行此操作。我也使用你的样本数据做top2来显示结果。

select audit.auditid,Summary,DATE 
from 
    Audit inner join Summary Sum_Tab1 on Audit.AUDITID=Sum_Tab1.AUDITID 
where 
    Sum_Tab1.SUMMARY in 
        (SELECT top 2 SUMMARY from Summary Sum_Tab2 
            where Sum_Tab1.AUDITID=Sum_Tab2.AUDITID order by summary)