首页 > 解决方案 > SQL:如何限制查询一条记录?

问题描述

我坚持将记录限制为每个用户一条记录,但无法找到任何解决方案,我不是 SQL 查询专家,因此需要一些帮助。“获取第一行”不起作用。

要求:
获取交易表中所有使用同一张卡支付的用户。

我已经写了查询,这给了我想要的结果。查询如下:

SELECT distinct 
D1.ID, D1.CUSTOMER_ID, D1.TOKEN_VALUE FROM ORDER_DETAILS D1, ORDER_DETAILS D2
WHERE D1.TOKEN_VALUE = D2.TOKEN_VALUE AND D1.CUSTOMER_ID <> D2.CUSTOMER_ID 
ORDER BY  D1.TOKEN_VALUE desc;

查询的输出如下:
查询结果

查询的问题是我正在为同一用户获取多条记录,但是我想将数据限制为每个用户一行。
Query 中需要进行哪些修改才能将数据限制为每个用户的一条记录,而不是获取所有事务。

标签: sqloracle-sqldeveloper

解决方案


您可以使用窗口函数:

SELECT DISTINCT OD.CUSTOMER_ID, OD.TOKEN_VALUE
FROM (SELECT OD.*,
             MIN(CUSTOMER_ID) OVER (PARTITION BY TOKEN_VALUE) as MIN_CUSTOMER_ID,
             MAX(CUSTOMER_ID) OVER (PARTITION BY TOKEN_VALUE) as MAX_CUSTOMER_ID
      FROM ORDER_DETAILS OD
     ) OD
WHERE MIN_CUSTOMER_ID <> MAX_CUSTOMER_ID
ORDER BY OD.TOKEN_VALUE DESC;

不需要JOIN

另一种方法使用EXISTS

SELECT DISTINCT OD.CUSTOMER_ID, OD.TOKEN_VALUE
FROM ORDER_DETAILS OD
WHERE EXISTS (SELECT 1
              FROM ORDER_DETAILS OD2
              WHERE OD2.TOKEN_VALUE = OD.TOKEN_VALUE AND
                    OD2.CUSTOMER_ID <> OD.CUSTOMER_ID
             )
ORDER BY OD.TOKEN_VALUE;

推荐阅读