Сложный запрос (DB2) - PullRequest
       5

Сложный запрос (DB2)

1 голос
/ 08 февраля 2010

Предположим, у меня есть таблица spitems со следующими полями:

  • spitemid (уникальный ключ)
  • изменение (метка времени)
  • ParentId
  • ряд других незначимых полей

То, что я хочу получить, - это строки с самыми высокими значениями дня для каждой парентиды.

Однако имейте в виду, что метка времени для модификации не уникальна, поэтому возможно, что для одного родительского идентификатора есть две злобные метки с одинаковой меткой времени для модификации. В таком случае мне нужна одна из этих двух злобных кличек, мне все равно, какая именно.

Итак, чтобы быть ясным: список, который я возвращаю, должен содержать все парентиды один и только один раз.

Ответы [ 5 ]

2 голосов
/ 08 февраля 2010

обновление

встреча окончена, вот мой снимок:

select * 
from table
join where spitmid in 
  (select max(spitmid) 
   from table
   join 
     (select parentid, max(modifiedon) as d from table group by parentid) inlist
      on table.parentid = inlist.parentid and table.modifiedon = inlist.d
   group by parentid, datemodified
  ) 

старая запись

не уверен, если это отличается от DB2, здесь это для сервера SQL.

    select * 
    from table
    join (select parentid, max(modifiedon) as d from table group by parentid) as toplist on 
      table.parentid = toplist.parentid and table.modifiedon = toplist.d

хм ... это вернет больше, чем один для дураков ... сейчас не могу это исправить, надо идти на встречу.

1 голос
/ 08 февраля 2010

Исходя из ваших требований, вы должны получить самые последние товары

SELECT    t1.*
FROM      Table t1
          INNER JOIN (
            SELECT    spitemid = MAX(t1.spitemid)
            FROM      Table t1
                      INNER JOIN (
                        SELECT   parentid, modifiedon = MAX(modifiedon)
                        FROM     Table
                        GROUP BY parentid
                      ) t2 ON t2.parentid = t1.parentid
                              AND t2.modifiedon = t1.modifiedon
            GROUP BY  t1.parentid, t1.modifiedon
          ) t2 ON t2.spitemid = t1.spitemid
0 голосов
/ 24 февраля 2010

Общее табличное выражение даст вам возможность нумеровать строки перед тем, как вы выполните последний SELECT.

WITH items AS 
(
SELECT spitemid, parentid, modifiedon, 
ROWNUMBER() OVER (PARTITION BY parentid ORDER BY modifiedon DESC) AS rnum
FROM yourTable
)
SELECT spitemid, parentid, modifiedon FROM items WHERE rnum = 1
;
0 голосов
/ 08 февраля 2010
SELECT sr.receiving_id, sc.collection_id FROM stock_collection as sc, stock_requisation as srq, stock_receiving as sr WHERE (sc.stock_id = '" & strStockID & "' AND sc.datemm_issued = '" & strMM & "' AND sc.qty_issued >= 0 AND sc.collection_id = srq.requisition_id AND srq.active_status = 'Active') OR (sr.stock_id = '" & strStockID & "' AND sr.datemm_received = '" & strMM & "' AND sr.qty_received >= 0)
0 голосов
/ 08 февраля 2010

Вы можете сделать это с помощью двух вложенных подзапросов. Первый получает максимальное изменение на каждую парентиду, а второй получает максимальное количество spitemid для каждой группы парентид / модифицированных.

SELECT *
FROM spitems
WHERE spitemid IN 
(
    SELECT      parentid, modifiedon, max(spitemid) spitemid
    FROM (
        SELECT      parentid, MAX(modifiedon) modifiedon
        FROM        spitems
        GROUP BY    parentid
    ) A
    GROUP BY parentid, modifiedon
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...