Sql 如何在不重复的情况下获取行号

Sql 如何在不重复的情况下获取行号,sql,Sql,我想从列表中获取行号。我尝试了不同变化的行数和密集列,得到的只是重复的行 下面是我的代码,SQL返回所有订单的列表,其中包括订单20的一些产品id,这三种产品“1013”、“1024”、“1025” 问题是,当我试图从该列表中获取行数时,它会复制一些行,因为在该顺序中包含多个产品 我的代码如下所示: Order_number 20 22 27 Row_number | Order_number 1 20 2 22 3 27 对

我想从列表中获取行号。我尝试了不同变化的行数和密集列,得到的只是重复的行

下面是我的代码,SQL返回所有订单的列表,其中包括订单20的一些产品id,这三种产品“1013”、“1024”、“1025”

问题是,当我试图从该列表中获取行数时,它会复制一些行,因为在该顺序中包含多个产品

我的代码如下所示:

Order_number
20
22
27
Row_number | Order_number
1            20
2            22
3            27
对于ROW_NUMBER,它看起来像这样,这就是问题所在:

Row_number | Order_number
1            20
2            20
3            20
4            22
5            27
6            27
我希望它看起来像这样:

Order_number
20
22
27
Row_number | Order_number
1            20
2            22
3            27
1.首先获取您的独特订单号,然后获取编号:

SELECT ROW_NUMBER() OVER (ORDER BY ORDER_ID), ORDER_ID
FROM
  (
    SELECT ORDER_ID
    FROM ORDERS    
    INNER JOIN STORAGE ON ORDERS.PRODUCT_ID = STORAGE.PRODUCT_ID    
    WHERE STORAGE.PRODUCT_ID IN ('1013', '1024', '1025')
    GROUP BY ORDER_ID
  ) dt
2.不要连接到存储表,而是使用相关子查询

 SELECT ROW_NUMBER() OVER (PARTITION BY ORDER_ID), ORDER_ID
 FROM ORDERS o
 WHERE EXISTS 
     (
         SELECT 1
         FROM STORAGE s
         WHERE s.PRODUCT_ID IN ('1013', '1024', '1025')
           AND s.PRODUCT_ID = o.PRODUCT_ID
     ) dt
3.使用DENSE_RANK没有经过测试,因为您没有说明正在使用什么RDBMS,但它可能会工作

    SELECT DISTINCT DENSE_RANK() OVER (ORDER BY ORDER_ID), ORDER_ID
    FROM ORDERS    
    INNER JOIN STORAGE ON ORDERS.PRODUCT_ID = STORAGE.PRODUCT_ID    
    WHERE STORAGE.PRODUCT_ID IN ('1013', '1024', '1025')
1.首先获取您的独特订单号,然后获取编号:

SELECT ROW_NUMBER() OVER (ORDER BY ORDER_ID), ORDER_ID
FROM
  (
    SELECT ORDER_ID
    FROM ORDERS    
    INNER JOIN STORAGE ON ORDERS.PRODUCT_ID = STORAGE.PRODUCT_ID    
    WHERE STORAGE.PRODUCT_ID IN ('1013', '1024', '1025')
    GROUP BY ORDER_ID
  ) dt
2.不要连接到存储表,而是使用相关子查询

 SELECT ROW_NUMBER() OVER (PARTITION BY ORDER_ID), ORDER_ID
 FROM ORDERS o
 WHERE EXISTS 
     (
         SELECT 1
         FROM STORAGE s
         WHERE s.PRODUCT_ID IN ('1013', '1024', '1025')
           AND s.PRODUCT_ID = o.PRODUCT_ID
     ) dt
3.使用DENSE_RANK没有经过测试,因为您没有说明正在使用什么RDBMS,但它可能会工作

    SELECT DISTINCT DENSE_RANK() OVER (ORDER BY ORDER_ID), ORDER_ID
    FROM ORDERS    
    INNER JOIN STORAGE ON ORDERS.PRODUCT_ID = STORAGE.PRODUCT_ID    
    WHERE STORAGE.PRODUCT_ID IN ('1013', '1024', '1025')
我建议使用exists,这样您就不必处理重复消除:

SELECT o.ORDER_ID
FROM ORDERS o
WHERE EXISTS (SELECT 1
              FROM STORAGE S
              WHERE o.PRODUCT_ID = s.PRODUCT_ID AND
                    s.PRODUCT_ID IN (1013, 1024, 1025)
             );
使用STORAGEORDER\u ID、PRODUCT\u ID上的索引,这应该具有非常好的性能

您还可以使用存储上的聚合直接执行此操作:

我建议使用exists,这样您就不必处理重复消除:

SELECT o.ORDER_ID
FROM ORDERS o
WHERE EXISTS (SELECT 1
              FROM STORAGE S
              WHERE o.PRODUCT_ID = s.PRODUCT_ID AND
                    s.PRODUCT_ID IN (1013, 1024, 1025)
             );
使用STORAGEORDER\u ID、PRODUCT\u ID上的索引,这应该具有非常好的性能

您还可以使用存储上的聚合直接执行此操作:


您使用的是哪种DBMS产品?SQL只是一种查询语言,不是特定数据库产品的名称,您的查询是无效的标准SQL。请为您正在使用的数据库产品添加。您使用的是哪种DBMS产品?SQL只是一种查询语言,不是特定数据库产品的名称,您的查询是无效的标准SQL。请为您正在使用的数据库产品添加。2.最有意义——至少对我来说是这样。第三个正在工作。第一个和第二个sql sayd的语法不正确。我试图解决它,但没有结果。我解决了第一个和第二个问题。我只是缺少派生表/子查询的别名。@JNevil,我将尝试使用它们。这个派生表对我来说是全新的东西。谢谢。最有意义——至少对我来说是这样。第三个正在工作。第一个和第二个sql sayd的语法不正确。我试图解决它,但没有结果。我解决了第一个和第二个问题。我只是缺少派生表/子查询的别名。@JNevil,我将尝试使用它们。这个派生表对我来说是全新的东西。谢谢。谢谢,第一个很有趣。但在存储中没有订单id,只有产品id。我用这个组合得到了它:按订单id ASC行在订单上选择不同的密集等级,订单id从订单O中选择1,其中O.product\U id=S.product\U id,S.product\U id在1013、1024、1025中;谢谢,第一个很有趣。但在存储中没有订单id,只有产品id。我用这个组合得到了它:按订单id ASC行在订单上选择不同的密集等级,订单id从订单O中选择1,其中O.product\U id=S.product\U id,S.product\U id在1013、1024、1025中;