Sql Oracle上的Distinct select
我正在尝试做的是一个简单的推荐程序,必须取权重最大的前40个元素的node2元素。重量的计算来自E.重量*K.等级。现在,这段代码成功地返回了前40个元素。但是,我不希望E.NODE2返回重复项。PostgreSQL允许我在NODE2上执行SELECT DISTINCT操作,即E.NODE2,E.WEIGHT*K.GRADE。如何在oracle中实现同样的功能 完整的sql查询Sql Oracle上的Distinct select,sql,oracle,Sql,Oracle,我正在尝试做的是一个简单的推荐程序,必须取权重最大的前40个元素的node2元素。重量的计算来自E.重量*K.等级。现在,这段代码成功地返回了前40个元素。但是,我不希望E.NODE2返回重复项。PostgreSQL允许我在NODE2上执行SELECT DISTINCT操作,即E.NODE2,E.WEIGHT*K.GRADE。如何在oracle中实现同样的功能 完整的sql查询 SELECT * FROM (SELECT DISTINCT E.NODE2 , (E.WEIGHT * K.
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
我相信你想要像这样的东西
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
我相信你想要像这样的东西
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
在您的子选择中,我认为您需要:MAXE.WEIGTH*K.GRADE,以便每个E.NODE2只返回一个值
这意味着您还需要按E.NODE2分组。在子选择中,我认为您需要:MAXE.WEIGTH*K.GRADE,以便每个E.NODE2只返回一个值
这意味着您还需要按E.NODE2分组。这应该可以解决您的问题,尽管速度相当慢
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
这应该可以解决你的问题,尽管速度很慢
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
关于我不希望E.NODE2返回重复项,这与不随意选择任何限定行有关;你不应该只选择一个,除非你的程序只是根据标准显示数据样本,而不是完全在统计方面,重复是不可避免的。检查这个:简而言之,使用Postgreql的DISTINCT-ON,注意我不希望E.NODE2返回重复项,这与不随意选择任何限定行有关;你不应该只选择一个,除非你的程序只是根据标准显示数据样本,而不是完全在统计方面,重复是不可避免的。检查这个:简而言之,小心地接近Postgreql的DISTINCT ON