Группа SQL - предел - PullRequest
       9

Группа SQL - предел

1 голос
/ 23 июня 2011

Иногда найти лучший способ сообщить о «проблеме» так же сложно, как найти решение ... LOL, но здесь идет ...

У меня есть таблица с компаниями, у меня есть связанная таблица с историей для каждой компании ... Я хочу вернуть запрос с набором записей последних 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). ) * +1010 *

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'

Что я делаю не так?

Ответы [ 2 ]

1 голос
/ 23 июня 2011
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 по дате, чтобы это работало.

Возможно, вам придется заменить datediff на функцию, соответствующую вашему вкусу SQL, я действительно знаю только SQL Server.

1 голос
/ 23 июня 2011

Похоже, что DB2 поддерживает ROW_NUMBER () с предложением OVER. Я догадываюсь о синтаксисе, но, надеюсь, это укажет вам правильное направление:

SELECT
    CompanyName,
    SomeColumn
FROM (
    SELECT
        C.CompanyName,
        H.SomeColumn,
        ROW_NUMBER() OVER(PARTITION BY C.ID ORDER BY CH.DATE DESC)
    FROM
        Companies C
    INNER JOIN CompanyTypes CT ON C.fkTypeID = CT.ID
    INNER JOIN CompanyHistory CH ON CH.fkCompanyID = C.ID
) AS SQ
...