【问题标题】:Most optimal way to prioritize records based on bit columns基于位列对记录进行优先级排序的最佳方法
【发布时间】:2019-04-05 21:07:16
【问题描述】:

FK GeoNameId 表 GeoNames(未显示)和 GeoNameAlternateNames(如下所示)之间存在一对多关系。鉴于以下结构,我想获取 IsPreferredName = 1 的替代名称值,如果未找到,则使用下一列 IsShortName,如果未找到该记录,则使用下一列,依此类推。在这种情况下,我希望返回顶行。请记住,我将从 GeoNames 表加入此表。

GeoNames 中有超过 1100 万条记录,GeoNamesAlternateNames 中有超过 1700 万条记录,因此像尼安德特人一样处理它是不可接受的解决方案。

在这方面表现最好的策略是什么?我已经尝试过分组,在每列上加入并合并,在子表中排名,我正要拔出我的头发。提前致谢。

【问题讨论】:

  • 您使用的是哪个 DBMS?
  • 您可以更改表,即添加要索引的计算列吗?所有is... 列的值是1 还是NULL(或者可能是0)?我假设 fromto 不是检查的一部分,对吗?
  • 我们使用的是 sql server 2016。我想保持原始数据源不变,尽可能不转换数据。感谢您的帮助。

标签: sql sql-server performance sql-server-2016


【解决方案1】:

这是一个优先级查询。您希望每个 geonameid 有一行,因此请使用 row_number() 和适当的 order by 子句:

select t.*
from (select t.*,
             row_number() over (partition by geonameid
                                order by (case when IsPreferredName = 1 then 1
                                               when IsShortName = 1 then 2
                                               . . .
                                          end)
                               ) as seqnum
      from t
     ) t
where seqnum = 1;

【讨论】:

  • 这看起来像是我将在星期一尝试的技巧!谢谢!
猜你喜欢
  • 2020-12-15
  • 1970-01-01
  • 2020-06-20
  • 2012-07-15
  • 2021-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多