Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Oracle上的Distinct select_Sql_Oracle - Fatal编程技术网

Sql Oracle上的Distinct select

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.

我正在尝试做的是一个简单的推荐程序,必须取权重最大的前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.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