sql - 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 中需要进行哪些修改才能将数据限制为每个用户的一条记录,而不是获取所有事务。
解决方案
您可以使用窗口函数:
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;
推荐阅读
- azure - 将点到站点与 Azure VPN 网关一起使用时的私有 DNS 方法?
- excel - excel中格式为YYYY-mm-dd hh:mm:ss.ffffff的两个时间戳之间的时间差
- android - 添加点击通知操作的日志
- cluster-analysis - Weka ClusterMembership 过滤器只给出 1 和 0 的概率
- python - 使用 (arr.transpose() == arr).all() 的意外对称测试结果
- mysql - 计算每个人被分配到的活动
- c# - EqualityComparer 和 Action
- java - 从 ID 选择中选择多个类
- r - 使用grid.arrange时如何减少ggplot和下一个文本之间的空间?
- python - 对象上的 Python itertools 组合