问题描述
column1|column2|state|
-------|-------|-----|
test1 | 2| 0|
test1 | 3| 0|
test1 | 1| 1|
test2 | 2| 1|
test2 | 1| 2|
我想选择(实际上是删除,但我使用select进行测试)所有不具有唯一column1
的列,并且不仅选择(实际上保留)具有以下内容的行:
- 状态= 0,第2列中的最小值,
- 如果不存在状态= 0的行,则该列在column2中只有最小值。
所以选择结果应该是:
column1|column2|state|
-------|-------|-----|
test1 | 3| 0|
test1 | 1| 1|
test2 | 2| 1|
,保留的行(在删除的情况下)应为:
column1|column2|state|
-------|-------|-----|
test1 | 2| 0|
test2 | 1| 2|
我尝试通过以下方法实现此目标(无效):
SELECT * FROM table1 AS result1
WHERE
result1.column1 IN
(SELECT
result2.column1
FROM
table1 AS result2
WHERE /*part that works*/)
AND
result1.column2 >
(SELECT
min(result3.column2)
FROM
table1 AS result3
WHERE (COALESCE(
result3.column1 = result1.column1
AND
result3.state = 0,WHERE
result3.column1 = result1.column1
)))
我不知道的部分位于result1.column2 >
后面。
我想将result1.column2
与
- 结果集中的最小值,其中
it3.state = 0
, - 如果1.不存在,则具有类似结果集中的最小值,且没有
it3.state = 0
条件。
那是我的问题,我希望这是有道理的。也许可以用更高效/更整洁的方式完全重写它。
您能帮我解决该查询吗?
解决方法
这是您想要的吗?
SELECT
*
FROM
table1 AS result1
WHERE
result1.column1 IN (SELECT result2.column1
FROM table1 AS result2
WHERE /*part that works*/)
AND result1.column2 > COALESCE( ( SELECT min(result3.column2)
FROM table1 AS result3
WHERE result3.column1 = result1.column1
AND result3.state = 0 ),( SELECT min(result3.column2)
FROM table1 AS result3
WHERE result3.column1 = result1.column1 )
)
;