这是SQL的新手,如果能用一个切片器来处理这个问题,那就太好了。
下面是一个示例表:
col1 | col2 | col3 | 日期|||
---|---|---|---|---|---|
1 | 1 | 2 | 2011年01月22日|||
1 | 1 | 4 | 2011-01-27 | ||
3 | 3 | 2 | 2011-01-20 | ||
3 | 8 | >4 | 2011-01-12 | ||
3 | 8 | 22011年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