我在SQLite 3.38.2数据库中有一个RoadInsp表。为了回答这个问题,我将数据放在CTE中:
with roadinsp (objectid, asset_id, date_, condition) as (
values
(1, 1, '2016-04-01', 20),
(2, 1, '2019-03-01', 19),
(3, 1, '2022-01-01', 18),
(4, 2, '2016-04-01', 17),
(5, 2, '2022-01-01', 16),
(6, 3, '2022-03-01', 15), --duplicate date
(7, 3, '2022-03-01', 14), --duplicate date
(8, 3, '2019-01-01', 13)
)
select * from roadinsp
objectid asset_id date_ condition
1 1 2016-04-01 20
2 1 2019-03-01 19
3 1 2022-01-01 18
4 2 2016-04-01 17
5 2 2022-01-01 16
6 3 2022-03-01 15
7 3 2022-03-01 14
8 3 2019-01-01 13
demo
我使用的GIS软件只允许我在WHERE子句/SQL表达式中使用SQL,而不是完整的SELECT查询。
我想使用WHERE子句选择 * 每组中最大的n *。换句话说,对于每个ASSET_ID,我想选择日期最晚的行。
我可以使用如下WHERE子句表达式来实现这一点:
date_ =
(select max(subq.date_) from roadinsp subq where roadinsp.asset_id = subq.asset_id)
objectid asset_id date_ condition
3 1 2022-01-01 18
5 2 2022-01-01 16
6 3 2022-03-01 15
7 3 2022-03-01 14
这样就可以了,但它为资产#3选择了两行,因为该资产有两行具有相同的日期。
因此,我想通过选择条件值最高的行来打破平局。它看起来像这样:
objectid asset_id date_ condition
3 1 2022-01-01 18
5 2 2022-01-01 16
6 3 2022-03-01 15 --this row has a higher condition value than the other duplicate row.
--so the other duplicate row was omitted.
我只想为每个资产选择一行。因此,如果也有重复的条件值,则选择哪一个并不重要,只要只选择一个即可。
使用WHERE子句子查询,如何选择 * 每组最大的n *,并使用具有最大条件的行打破平局?
3条答案
按热度按时间pieyvz9o1#
我将使用IN()与ORDER BY和LIMIT来检查主键...
这很容易扩展到每个资产
n
行。并且可以很容易地向ORDER BY添加附加条件。Demo
niknxzdl2#
也许您可以在 where 子句中添加另一个类似的条件(根据我的理解,您只能修改这些条件吗?):
更新的Fiddle
jgzswidk3#
要求
业务规则
asset_id
,选择包含最新date_
的asset_id
date_
上有多行,则选择condition
最大的行解决方案
date_
和condition
连接成一个,然后选择最大值(),如下所示:condition
的最大位数结果:
最新消息:
date_
和condition
,请将objectid
添加到列表中: