我有一张表:
USER | PLAN | START_DATE | END_DATE
1 | A | 20110101 | NULL
1 | B | 20100101 | 20101231
2 | A | 20100101 | 20100505
如果END_DATE
为is null
,则表示该用户当前具有该计划。
我想查询的是:(a)他当前正在使用的计划,或(b)他所参与的最新计划。对于每个给定的用户,我只需要返回一行。
现在,我设法通过使用联合和子查询做到了这一点,但是碰巧表很大,而且效率不高。你们中的每个人都可以有一种更快的查询方式吗?
谢谢,
[编辑]多数答案在这里返回单个值。那是我的坏事。我的意思是为每个用户返回一个值,但一次返回所有用户。我已经调整了我可以(并更正了问题)的答案,但只是明确说明以备将来参考。
没有有关数据和表的更多信息,这个问题很难回答。当您在评论中说您拥有所需的所有索引时,这些索引是什么?
另外,时间段是否邻接且不重叠?您能获取最近的START_DATE期间吗?
查看END_DATE的问题是普通的B树索引不能索引NULL。因此,该形式的谓词where end_date is nulll
不太可能使用索引。您可以在列中使用位图索引,因为那些索引类型会将索引设为空,但是由于位图索引的其他一些缺点,这可能并不理想。
由于上述原因,我可能会使用与以下查询类似的查询:
select user, plan, start_date, end_date
from (
select
user,
plan,
start_date,
end_date,
row_number() over (partition by user order start_date desc) as row_num_1,
row_number() over (partition by user order end_date desc nulls first) as row_num_2
from user_table
where user = :userid
)
where row_num_1 = 1
您可以根据实际需求在此处使用row_num_1
或row_num_2
列。
或者
select user, plan, start_date, end_date
from (
select
user,
plan,
start_date,
end_date,
from user_table
where user = :userid
order by start_date desc
)
where rownum = 1
无论您是试图让所有用户返回还是仅返回一个用户,第一个查询都应该起作用。第二个查询仅适用于一个用户。
如果您可以使用架构的更多详细信息(索引,开始/结束日期的含义)来补充问题,则可能会得到更好的答案。
我试图在mongodb日志文件中只记录慢速查询(执行时间超过10秒)。 我在运行蒙戈作为 并将分析设置为 但是当跟踪日志文件时,它会打印所有的查询。我可以看到很多查询,它的运行时间为0ms。我还需要添加什么来只获得慢速查询吗?
我有下表: 我还有以下表: 现在我有以下疑问: 长话短说--我的目标是,给定值,从表中获取最新的值。 它应该是这样工作的:给定值-在表中搜索与相同值的匹配记录(注意此列是唯一的)。然后-在表中查找最新的值(使用值)。使用与表中的列匹配的列在此表中搜索它。 当前,该查询将返回,但不返回(我需要它是3030)。你能帮我修一下吗?
与RDBMS类似,OrientDB支持不同类型的SQL查询以从数据库检索记录。 在检索记录时,我们有不同的变体或查询选项以及select语句。 以下语句是命令的基本语法。 以下是有关上述语法中选项的详细信息。 - 表示想从查询中提取的数据作为结果记录集。 - 表示要查询的对象。 这可以是一个类,群集,单个记录标识,一组记录标识。可以将所有这些对象指定为目标。 - 指定过滤结果集的条件。 - 表示在
本文向大家介绍Mysql Binlog快速遍历搜索记录及binlog数据查看的方法,包括了Mysql Binlog快速遍历搜索记录及binlog数据查看的方法的使用技巧和注意事项,需要的朋友参考一下 目标,开发人员说有个数据莫名其妙添加了,但是不知道是从哪里添加的,而且应用功能里面不应该添加这样的数据,为了查清楚来源,所以我就准备去binlog里面找了,但是binlog有好几个月的数,我这样一个个
正如标题所示…我试图找出开销最小的最快方法来确定记录是否存在于表中。 示例查询: 说<代码>?与< code>'TB100'交换...第一个和第二个查询将返回完全相同的结果(比如...此对话的< code>1)。最后一个查询将按预期返回< code>'TB100',如果< code>id不在表中,则返回nothing。 目的是弄清楚是否在表中,如果不在,程序接下来将插入记录,如果是,程序将跳过它或
问题内容: 我有一个具有相似结构和数据的示例表,如下所示: 表在每个学生出现的所有科目中都有每个学生的合并标记。 请帮助我,编写一个查询以提取每个学生( 不分学科/其他学生 )获得的MAXIMUM分数,如下所示: 按S_Name和Max(MARK_Value)分组 问题答案: 使用窗口功能 或者您可以使用相关的子查询