admin

SQL组-限制

sql

有时找到沟通“问题”的最佳方法与找到解决方案一样困难……大声笑,但是这里…

我有一个与公司相关的表,我有一个与每个公司相关的历史记录的相关表…我想返回一个查询,其中包含每个公司的最后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'

我究竟做错了什么?


阅读 230

收藏
2021-07-01

共1个答案

admin

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对表进行排序才能使其正常工作。

您可能需要datediff用适合您的SQL风格的函数替换,我只真正知道SQL Server。

2021-07-01