2010-02-08 3 views
1

Предположим, у меня есть таблица под названием spitems со следующими полями:Сложный запрос (DB2)

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

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

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

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

+0

если это SQL Server, это было бы DUP этого вопроса (и другие) http://stackoverflow.com/questions/2215129/can-this-sql-statement-be-refactored-to- не использовался-разряд-раздел/2215159 # 2215159 – Hogan

+0

... но это не. – Fortega

+0

Чтобы быть понятным, когда вы говорите «с наивысшим измененным * днем», вы имеете в виду * дату * правильно? – JosephStyons

ответ

2

обновление

встреча закончилась, вот мой выстрел:

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 

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

+0

это возвращает две строки для родительских элементов, для которых дата модификации равна – Fortega

+1

Ответ Сэма решает проблему с дублированием ... другой подзапрос - это путь (в sql-сервере вы можете использовать cross apply ...) – Hogan

+0

Ответ Сэма содержит ошибку :) – Fortega

1

Основываясь на ваших требованиях, нижеследующие должны предоставить вам самые последние товары.

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 
+1

max (spitemid) неверен - это может быть не та самая запись, что и max (modifiedon) – Hogan

+0

+ Я хотел бы получить все остальные поля также – Fortega

+0

@Hogan, совершенно верно. Исправлена ​​ошибка, thx. –

0

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

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 
) 
+0

Это не сработает: вы выбираете max (spitemid) из таблицы с только родительским и измененным полями. Исключение: spitemid недействителен в контексте, где он используется. – Fortega

+0

@Fortega, вы правы, я хотел снова присоединиться к 'spitems', чтобы захватить' spitemid' на основе 'modifiedon'. Забыл. –

-3
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

ты действительно кошка-вау (я не -1 нообы, но ты в порядке) – Hogan

+0

Спасибо, что был хорошим Хоганом :) – wowcat

+0

Однако insta-minus один от какого-то тролля. Вы не видите, что они вносят свой вклад. – wowcat

0

Общее табличное выражение даст вам возможность нумерации строк, прежде чем выдать окончательный 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 
; 
Смежные вопросы