我有一个这样的表。
id | 值 | text类型 | <1ch>eqPath<2th>已启用>||
---|---|---|---|---|
1 | 0 | 未知 | 空真 | |
2 | 1 | 生产生产 | 空 | 真|
3 | 2 | 空闲 | 空闲空 | 真|
4 | 3 | 维护 | 维护空 | 真|
5 | 4 | 切换 | 切换空 | 真 |
6 | 5 | 清洁清洁 | 空 | 真 |
7 | 6 | 工程 | 其他空真||
8 | 7 | 培训 | 其他空真||
9 | 8 | 暂停空闲空真|||
1 | 1 | 运行 | 生产"序列/排序/生产线1"> | 真 |
11 | 运行 | 生产"序列/排序/第2行"> | 真 | [/tr>|
12 | 5 | 清洗清洁"分拣/第2行"> | 错误||
13 | 10 | 锁定维护 | "序列/排序/行2"> | 错误
您可以使用ROW_NUMBER来标记行,并在过滤器中使用它来获得预期的结果。
sql查询将类似于-
select id, value, text, type, eqPath, enabled
from
(select * ,
row_number() over( partition by value order by eqPath desc) rn
from <your-table>
where (eqPath is null or eqPath = ?) ) tbl
where rn = 1
order by value
查询中的row_number
将为每一行放置一个行号,并在值更改时重置,因此最终那些行号匹配1的行将是我们需要获取的行。
这里是一个小提琴
我想我想出了一个解决方案:
SELECT *
FROM modes
WHERE eqPath IS NULL
AND value NOT IN (
SELECT value
FROM modes
WHERE eqPath = ?
)
UNION
SELECT *
FROM modes
WHERE eqPath = ?
ORDER BY value