SQL : 如何限制查询一条记录?

SQL : How to limit query for one record?

我坚持将记录限制为每个用户一条记录,但找不到任何解决方案,我不是 SQL 查询方面的专家,因此需要一些帮助。 "FETCH FIRST ROW" 无效。

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

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

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;

查询的输出为:

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

您可以使用 window 个函数:

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;

如果您 运行 没有 D1.ID 的相同查询,您应该会得到您正在寻找的结果

SELECT distinct 
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;