Различный выбор на Oracle - PullRequest
0 голосов
/ 24 декабря 2010

То, что я пытаюсь сделать, - это простой рекомендатель, который должен взять элемент node2 с самым большим взвешенным верхним 40 элементом. Расчет веса происходит от (E.WEIGHT * K.GRADE). Теперь этот код успешно возвращает 40 лучших элементов. Однако я не хочу, чтобы E.NODE2 возвращал дубликаты . POSTGRE SQL позволил мне сделать SELECT DISTINCT ON (NODE2) E.NODE2 , (E.WEIGHT * K.GRADE). Как я могу сделать то же самое в оракуле?

Полный SQL-запрос;

SELECT *
 FROM   (SELECT DISTINCT E.NODE2  , (E.WEIGHT * K.GRADE)
    FROM KUAISFAST K, EDGES E
    WHERE K.ID = 1 AND K.COURSE_ID = E.NODE1 AND E.NODE2 NOT IN(
        SELECT K2.COURSE_ID
        FROM KUAISFAST K2
        WHERE K2.ID = 1
        ) 
    ORDER BY( E.WEIGHT * K.GRADE ) DESC) TEMP
WHERE rownum <= 40

Ответы [ 3 ]

1 голос
/ 24 декабря 2010

В вашей подвыборке, я думаю, вы хотите: MAX(E.WEIGTH * K.GRADE), чтобы возвращалось только одно значение для каждого E.NODE2.

Это означает, что вам также нужно GROUP BY E.NODE2.

1 голос
/ 24 декабря 2010

Это должно решить вашу проблему, хотя и довольно медленно

SELECT * FROM
(SELECT *
 FROM   (SELECT E.NODE2 ,  max(E.WEIGHT * K.GRADE ) AS MAXDE
    FROM KUAISFAST K, EDGES E
    WHERE K.ID = 1 AND K.COURSE_ID = E.NODE1 AND E.NODE2 NOT IN(
        SELECT K2.COURSE_ID
        FROM KUAISFAST K2
        WHERE K2.ID = 1
        ) 
        GROUP BY E.NODE2 )
ORDER BY MAXDE DESC)
WHERE rownum <= 40
1 голос
/ 24 декабря 2010

Я полагаю, вы хотите что-то вроде

SELECT *
FROM   (
  SELECT 
      E.NODE2,
     (E.WEIGHT * K.GRADE),
      ROW_NUMBER() OVER (PARTITION BY E.NODE2 ORDER BY E.WEIGHT * K.GRADE DESC) R
  FROM 
      KUAISFAST K,
      EDGES E
  WHERE 
      K.ID = 1 AND 
      K.COURSE_ID = E.NODE1 AND 
      E.NODE2 NOT IN
        (  SELECT K2.COURSE_ID
           FROM KUAISFAST K2
          WHERE K2.ID = 1
        ) 
    ORDER BY (E.WEIGHT * K.GRADE) DESC
) TEMP
WHERE R=1 AND 
ROWNUM <= 40
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...