You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

查询重复数据中值最大的记录,自连接查询返回错误结果求助

筛选符合日期顺序要求的Key和Code

看起来你是要找出所有key和对应的code,要求同一个key下,当code值更大时,对应的date不能小于更小code的date——就像你说的Key8,因为code2的date比code1的小,所以不符合条件要排除对吧?

下面给你两种可靠的查询方法,适配大部分主流数据库:

方法1:用窗口函数(推荐,简洁高效)

窗口函数能很方便地对比同一key下不同code的日期。我们可以用LAG()函数拿到当前code的上一个(更小的)code对应的日期,然后筛选出符合要求的记录:

WITH ranked_records AS (
    SELECT 
        `key`,
        code,
        `date`,
        -- 按code升序,获取同一key下前一条记录的date
        LAG(`date`) OVER (PARTITION BY `key` ORDER BY code) AS prev_code_date
    FROM your_table
)
SELECT `key`, code
FROM ranked_records
-- 第一个code没有上一条记录,直接保留;其他code要求当前date >= 上一个code的date
WHERE prev_code_date IS NULL OR `date` >= prev_code_date;

如果你的数据库版本比较旧(比如MySQL 5.7及以前)不支持CTE,换成子查询写法就行:

SELECT `key`, code
FROM (
    SELECT 
        `key`,
        code,
        `date`,
        LAG(`date`) OVER (PARTITION BY `key` ORDER BY code) AS prev_code_date
    FROM your_table
) AS ranked_records
WHERE prev_code_date IS NULL OR `date` >= prev_code_date;

方法2:自连接排除不合格的Key

要是你不想用窗口函数,也可以先通过自连接找出所有存在问题的key(也就是有code小但date反而更大的情况),再排除这些key的所有记录:

-- 先找出所有不符合条件的key
WITH invalid_keys AS (
    SELECT DISTINCT t1.`key`
    FROM your_table t1
    JOIN your_table t2 
        ON t1.`key` = t2.`key` 
        AND t1.code < t2.code 
        AND t1.`date` > t2.`date`
)
-- 筛选出不在不合格列表里的key和code
SELECT `key`, code
FROM your_table
WHERE `key` NOT IN (SELECT `key` FROM invalid_keys);

同样,不支持CTE的话改成子查询:

SELECT `key`, code
FROM your_table
WHERE `key` NOT IN (
    SELECT DISTINCT t1.`key`
    FROM your_table t1
    JOIN your_table t2 
        ON t1.`key` = t2.`key` 
        AND t1.code < t2.code 
        AND t1.`date` > t2.`date`
);

为啥你之前的自连接会出错?

你之前用自连接得到错误结果,大概率是没处理好逻辑:比如如果直接自连接筛选符合条件的记录,很容易重复返回数据,或者漏掉第一个code的记录;而上面的方法2是先定位所有有问题的key,再整体排除,这样就能保证结果准确啦。


内容的提问来源于stack exchange,提问作者user3007447

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:21:33