在SQL表中查找所有两列重复项,其中第三列的后一个值大于前一个值

  • 本文关键字:一个 三列 大于 查找 SQL 两列 sql sqlite
  • 更新时间 :
  • 英文 :


这是SQL的新手,如果能用一个切片器来处理这个问题,那就太好了。

下面是一个示例表:

日期2011年01月22日>2
col1 col2 col3
1 1 2
1 1 4 2011-01-27
3 3 2 2011-01-20
3 842011-01-12
3 82011年01月30日
4 1 3 2011-01-09
5 3 3 2011年01月27日
5 4 2 2011年01月22日

我会在这里使用ROW_NUMBER和透视逻辑:

WITH cte AS (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY col1, col2
ORDER BY date) rn
FROM yourTable
)
SELECT col1, col2
FROM cte
GROUP BY col1, col2
HAVING MAX(CASE WHEN rn = 2 THEN col3 END) >
MAX(CASE WHEN rn = 1 THEN col3 END);

演示

这种方法与你目前正在做的非常接近。唯一添加的是HAVING子句,它将较新的col3值与较旧的值进行比较。注意,这个答案假设你的";"重复";只会成对出现,而不是三元组,等等。

编辑:

如果由于某种原因,你真的不能使用窗口函数,例如,因为你使用的是一个非常旧的SQLite版本,我们仍然可以使用上面的连接方法:

SELECT t1.col1, t1.col2
FROM yourTable t1
INNER JOIN
(
SELECT col1, col2, MIN(date) AS min_date, MAX(date) AS max_date
FROM yourTable
GROUP BY col1, col2
) t2
ON t2.col1 = t1.col1 AND t2.col2 = t1.col2
GROUP BY t1.col1, t1.col2
HAVING
MAX(CASE WHEN t1.date = t2.max_date THEN col3 END) >
MAX(CASE WHEN t1.date = t2.min_date THEN col3 END);

演示

您可以使用FIRST_VALUE()窗口函数:

SELECT col1, col2
FROM (
SELECT DISTINCT col1, col2,
FIRST_VALUE(col3) OVER (PARTITION BY col1, col2 ORDER BY date) earlier_col3,
FIRST_VALUE(col3) OVER (PARTITION BY col1, col2 ORDER BY date DESC) latest_col3
FROM tablename
)
WHERE latest_col3 > earlier_col3

请参阅演示
结果:

> col1 | col2
> ---: | ---:
>    1 |    1

最新更新