Получить несколько значений, используя максимум в одном запросе - PullRequest
1 голос
/ 29 июня 2011

Моя таблица выглядит следующим образом:

audit cons articulo  date         bodega  amount    lote
---  |----|-----  |------------|--------|---------|------
11   | 2  | 10    | 04/03/2009 | BMP    | 399     |454
23   | 4  | 11    | 03/03/2009 | BMO    | 244     |787
31   | 2  | 10    | 04/03/2009 | BMP    | 555     |454
45   | 5  | 12    | 03/03/2009 | BNO    | 300     |786
23   | 7  | 11    | 03/03/2009 | BIM1   | 200     |123
61   | 4  | 10    | 04/03/2009 | BIM1   | 500     |783
75   | 5  | 13    | 24/01/2008 | BMP    | 600     |567
75   | 1  | 13    | 24/01/2008 | BMP    | 700     |777

Мне нужно выбрать сумму последней даты для каждого артикула, винного погреба и лота

audit + cons = pk таблицы

Пример:

audit cons articulo  date        bodega  amount      lote
---  |----|-----  |------------|--------|--------- |
11   | 2  | 10    | 04/03/2009 | BMP    | 399      |  454
23   | 4  | 11    | 03/03/2009 | BMO    | 244      |  787
45   | 5  | 12    | 03/03/2009 | BNO    | 300      |  786
23   | 7  | 11    | 03/03/2009 | BIM1   | 200      |  123
61   | 4  | 10    | 04/03/2009 | BIM1   | 500      |  783
75   | 5  | 13    | 01/01/2009 | BMP    | 600      |  567
75   | 1  | 13    | 01/01/2009 | BMP    | 700      |  777

проблема в том, что я не могу получить сумму, когда я использую:

select amount, bodega, articulo, max(date) ,lote
 from table 
 group by amount, bodega, articulo,lote

это повторяет много строк, любая помощь будетбольшой

Ответы [ 4 ]

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

Oracle 9i + поддерживает ROW_NUMBER:

WITH example AS (
  SELECT t.*,
         ROW_NUMBER() OVER(PARTITION BY t.bodega, t.articulo
                               ORDER BY t.audit) AS rnk
    FROM YOUR_TABLE t)
SELECT e.*
  FROM example e
 WHERE e.rnk = 1

В противном случае вы можете выполнить объединение с производной таблицей (но это вернет дубликаты, если имеется более одного bodega / articulo с одинаковым самым высоким значением даты):

SELECT a.*
  FROM YOUR_TABLE a
  JOIN (SELECT t.bodega, t.articulo, MAX(t.date) AS maxdate
          FROM YOUR_TABLE t
      GROUP BY t.bodega, t.articulo) b ON b.bodega = a.bodega 
                                      AND b.articulo = a.articulo 
                                      AND b.maxdate = a.date
1 голос
/ 30 июня 2011

Возможно сочетание MIN / MAX с использованием KEEP будет работать

0 голосов
/ 04 июля 2011

Просто попробуйте это ...

select * from table 
where (audit,cons,articulo ,date,bodega,Lote )
in (select min(audit),min(cons),articulo ,max(date),bodega,Lote  
    from table 
    group by articulo , bodega ,lote)
0 голосов
/ 29 июня 2011
SELECT 
  t1.amount, t1.bodega, t1.articulo, t1.date
FROM 
  table t1 join 
  (select 
     bodega, articulo, max(date) date
   from 
     table 
   group by 
     amount, bodega, articulo
  ) on t1.bodega=t2.bodega and t1.articulo=t2.articulo and t1.date=t2.date
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...