有时找到沟通“问题”的最佳方法与找到解决方案一样困难……大声笑,但是这里…
我有一个与公司相关的表,我有一个与每个公司相关的历史记录的相关表…我想返回一个查询,其中包含每个公司的最后3个“历史”条目的记录集…
因此记录集将看起来像这样…
company A history Az history Ay history Ax company B history Bz history By history Bx company C history Cz history Cy history Cx
我遇到的问题是如果我限制3-连接在那儿,我只得到所有记录的最后3条记录,而不是每个公司的最后3条记录…
这是我上次尝试过的方法-但这只是撤回一家公司的3条记录..就是这样…(IBM DB2 9-但唯一会影响的是语法限制为3 ..)
SELECT C.CompanyName ,H.* FROM Companies C JOIN CompanyTypes CT ON C.fkTypeID = CT.ID INNER JOIN ( SELECT sCH.* FROM CompanyHistory sCH ORDER BY sCH.DATE DESC FETCH FIRST 3 ROWS ONLY ) H ON H.fkCompanyID = C.ID WHERE CT.Type = 'bookstore'
我究竟做错了什么?
SELECT C.CompanyName,H.* FROM Companies C JOIN CompanyTypes CT ON C.fkTypeID = CT.ID INNER JOIN ( SELECT sCH.* FROM CompanyHistory sCH ORDER BY sCH.DATE DESC -- order desc so we can count ) H ON H.fkCompanyID = C.ID WHERE CT.Type = 'bookstore' and 3>(select count(*) -- at most 2 previous occurances from CompanyHistory ich where ich.fkCompanyID=C.ID -- same company and datediff(d,ich.date,H.date)<0) -- but dates less than the row's date
基本上,我是在计算每家公司的前几行,并在我们超过2时删除行(+当前行为3)。您需要CompanyHistory按日期desc对表进行排序才能使其正常工作。
CompanyHistory
您可能需要datediff用适合您的SQL风格的函数替换,我只真正知道SQL Server。
datediff