LINUX.ORG.RU

oracle analytic function

 ,


0

1

Доброго времени суток.
Т.к. нет времени на гуглинг, позволю себе попробовать спросить здесь. Через пару часов поищу сам. :)
Есть подзапрос, возвращающий коллекцию документов, среди которых необходимо по двум полям (одно varchar2, второе number(1,0) aka boolean) выставить документам «вес», выбрав при этом любой из тех, у которых этот вес является наибольшим.
Псевдокод проставления весов на java:

List<SomeAbstractDoc> docs = obtainingFromSomewhere();
for (SomeAbstractDoc doc: docs) {
    int weight = 0;
    switch (status) {
        case DONE:
            weight = 1;
            break;
        case DRAFT:
            weight = 4;
            break;
        default:
            if (doc.isCorrection()) {
                weight = 2;
            } else {
                weight = 3;
            }
    }
    doc.setWeight(weight); // этого позора здесь вообще-то нет, там враппер над документом, но к постановке задачи не относится
}

Вопрос Oracle господам - вы не в курсе, есть ли под эту хотелку аналитическая функция, или придется делать dirty хак?
Спасибо заранее.

★★

Последнее исправление: bytecode (всего исправлений: 1)

WITH T1 AS
 (SELECT pre. doc_id,
         CASE pre.status
             WHEN 'DONE' THEN
              1
             WHEN 'DRAFT' THEN
              4
             ELSE
              CASE pre.is_correction
                  WHEN 1 THEN
                   2
                  WHEN 0 THEN
                   3
              END
         END doc_weight
    FROM (SELECT 1 doc_id, 'doc1' doc_name, 'DONE' status, 0 is_correction
            FROM dual
          UNION ALL
          SELECT 2 doc_id, 'doc2' doc_name, 'DRAFT' status, 1 is_correction
            FROM dual
          UNION ALL
          SELECT 3 doc_id, 'doc3' doc_name, 'NOTE' status, 0 is_correction
            FROM dual
          UNION ALL
          SELECT 3 doc_id, 'doc3' doc_name, 'NOTE' status, 1 is_correction
            FROM dual) pre)
SELECT MAX(t1.doc_id) KEEP(DENSE_RANK LAST ORDER BY t1.doc_weight) 
  FROM T1
ThePretender
()
Ответ на: комментарий от ThePretender

Надо меньше придумывать проблем, я с ходу не подумал про всемогущий case. Спасибо за совет.

bytecode ★★
() автор топика
Последнее исправление: bytecode (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.