用于选择首选糖果的高效 SQL 2000 查询

2024-01-09

(我希望我能想出一个更具描述性的标题...如果您能说出我要询问的查询类型,请建议一个或编辑这篇文章)

数据库:SQL Server 2000

示例数据(假设 500,000 行):



Name   Candy       PreferenceFactor
Jim    Chocolate   1.0
Brad   Lemon Drop   .9
Brad   Chocolate    .1
Chris  Chocolate    .5
Chris  Candy Cane   .5
499,995 more rows...
  

请注意,具有给定“名称”的行数是无限的。

期望的查询结果:



Jim    Chocolate   1.0
Brad   Lemon Drop   .9
Chris  Chocolate    .5
~250,000 more rows...
  

(由于克里斯对拐杖糖和巧克力的偏好相同,因此一致的结果就足够了)。

问题:如何从数据中选择名称、糖果,其中每个结果行都包含唯一的名称,以便所选糖果的每个名称具有最高的 PreferenceFactor。 (快速有效的答案优先)。

表上需要哪些索引?如果 Name 和 Candy 是另一个表的整数索引(除了需要一些联接之外),这会有什么不同吗?


您会发现以下查询优于给出的所有其他答案,因为它适用于单次扫描。这模拟了 MS Access 的 First 和 Last 聚合函数,这基本上就是您正在做的事情。

当然,您的 CandyPreference 表中可能会使用外键而不是名称。为了回答您的问题,实际上最好将 Candy 和 Name 作为另一个表的外键。

如果 CandyPreferences 表中还有其他列,那么拥有包含相关列的覆盖索引将产生更好的性能。使列尽可能小将增加每页的行数并再次提高性能。如果您最常使用 WHERE 条件执行查询来限制行,那么覆盖 WHERE 条件的索引就变得很重要。

Peter 的做法是正确的,但存在一些不必要的复杂性。

CREATE TABLE #CandyPreference (
   [Name] varchar(20),
   Candy varchar(30),
   PreferenceFactor decimal(11, 10)
)
INSERT #CandyPreference VALUES ('Jim', 'Chocolate', 1.0)
INSERT #CandyPreference VALUES ('Brad', 'Lemon Drop', .9)
INSERT #CandyPreference VALUES ('Brad', 'Chocolate', .1)
INSERT #CandyPreference VALUES ('Chris', 'Chocolate', .5)
INSERT #CandyPreference VALUES ('Chris', 'Candy Cane', .5)

SELECT
   [Name],
   Candy = Substring(PackedData, 13, 30),
   PreferenceFactor = Convert(decimal(11,10), Left(PackedData, 12))
FROM (
   SELECT
      [Name],
      PackedData = Max(Convert(char(12), PreferenceFactor) + Candy)
   FROM CandyPreference
   GROUP BY [Name]
) X

DROP TABLE #CandyPreference

实际上我不推荐这种方法,除非性能至关重要。 “规范”的方法是 OrbMan 的标准 Max/GROUP BY 派生表,然后连接到它以获取选定的行。但是,当有多个列参与 Max 的选择,并且选择器的最终组合可以重复时,即当没有列提供任意唯一性时(如这里的情况),该方法开始变得困难如果 PreferenceFactor 相同,我们就使用该名称。

编辑:最好提供更多使用说明,以帮助提高清晰度并帮助人们避免问题。

  • 作为一般经验法则,当尝试提高查询性能时,如果可以节省 I/O,您可以进行大量额外的数学计算。保存整个表查找或扫描可以大大加快查询速度,即使使用所有转换和子字符串等也是如此。
  • 由于精度和排序问题,使用此方法使用浮点数据类型可能不是一个好主意。不过,除非您处理的是非常大或非常小的数字,否则无论如何您都不应该在数据库中使用浮点型。
  • 最好的数据类型是那些在转换为二进制或字符后不打包并按相同顺序排序的数据类型。 Datetime、smalldatetime、bigint、int、smallint 和tinyint 都直接转换为二进制并正确排序,因为它们没有打包。对于二进制,避免 left() 和 right(),使用 substring() 使值可靠地返回到原始值。
  • 我利用了在此查询中小数点前面只有一位数字的 Preference,允许直接转换为 char,因为小数点之前总是至少有一个 0。如果可能有更多数字,则必须对转换后的数字进行小数对齐,以便正确排序。最简单的方法可能是乘以您的偏好评级,这样就没有小数部分,转换为 bigint,然后转换为二进制(8)。一般来说,数字之间的转换比 char 和其他数据类型之间的转换要快,尤其是对于日期数学。
  • 留意空值。如果有的话,你必须将它们转换成某种东西然后再转换回来。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用于选择首选糖果的高效 SQL 2000 查询 的相关文章

  • Linq lambda表达式多对多表选择

    我有三个表 其中两个是多对多关系 Picture 这是中间mm表中的数据 Edit 到这里 我得到正确的 4 行返回 但它们都是相同的结果 我知道我需要返回 4 行 但有不同的结果 return this mediaBugEntityDB
  • Google BigQuery 底层架构

    所以我大约 10 分钟前才开始摆弄 Google BigQuery 我想知道是否有人知道他们用来存储数据的底层架构 例如 这只是他们自己的下一代 BigTable 基础设施吗 另外 他们在索引 索引重建等方面使用什么样的策略是否清楚 我只是
  • SQL如何显示某个日期之前的数据

    我有几张桌子 一个是一个工人表显示工人代码 名字和姓氏 工作日期其中显示工人代码 工作开始日期 结束日期和工作区域代码 导师有工人编号 名字 姓氏和工作区号 Job area有工作区域代码名称和主管 我想要做的是在日期 10 09 10 之
  • DB2 Express 的默认用户名和密码

    我已在本地 Windows 计算机上安装了 Db2 Express 谁能告诉我默认的管理员凭据是什么 我尝试过以下组合 什么都不起作用 用户名 db2admin 密码 db2admin 用户名 db2admin 密码 密码123 应该是您本
  • Postgres 上的 C 语言环境和 Posix 语言环境有什么区别?

    我知道 Postgres 上的数据库区域设置负责国家字符的正确顺序 正确的小写 大写等 但为什么有两种语言中立的语言环境 posix and c 它们之间有什么区别 还是只是一个中立的语言环境有两个不同的名称 UPDATE正如 Magnus
  • 使用sqlbulkcopy之前如何创建表

    我有一个 DBF 文件 我正在尝试导入该文件 然后将其写入 SQL 表 我遇到的问题是 如果我使用 SqlBulkCopy 它需要我提前创建表 但在我的场景中这是不可能的 因为 dbf 文件不断变化 到目前为止 这是我的代码 public
  • MSSQL:如何使用代码编写存储过程创建脚本?

    我正在尝试使用一个数据库中存在但另一个数据库中不存在的 information schema routines 查询存储过程定义列表 SELECT t1 Routine Definition FROM server1 MyDatabase
  • 查询从同一表中的另一条记录获取值并按大于间隙阈值的差异进行过滤

    我将数据导入到 MS Access 中的临时表中 如下所示 我添加了需要使用 SQL 查询计算的 Gap 和 Previous Current 列 间隙阈值 是用户输入或范围提供给查询和例如是 300 GlobalID 对 ItemID 进
  • 如何从连接字符串中提取数据库名称,而不考虑 RDBMS?

    我正在研究一个不知道正在使用的 RDBMS 的课程 当然 应用程序的其余部分都清楚这一点 连接字符串是此类的输入 我需要数据库名称 无论 RDBMS 如何 如何从连接字符串中提取数据库名称 我读到以下问题 如何使用 SqlConnectio
  • xQuery LIKE 运算符?

    有没有办法以与 SQL 相同的方式使用 XQuery 执行 LIKE 操作 我不想构造一些 startswith endswith 和 contains 表达式 我想要实现的目标的示例 for x in user where x first
  • VIEW for 表结合 UNION ALL 的 MySQL 性能

    假设我有 2 张桌子MySQL create table persons id bigint unsigned not null auto increment first name varchar 64 surname varchar 64
  • 无法获取 ConfigBean 中实体的正确 ID - Java EE

    我正在构建一个药房管理应用程序 每个药房都需要一名管理员 约束是这样的 public class Pharmacy implements Serializable Id GeneratedValue strategy GenerationT
  • 了解涉及 3 个或更多表时 JOIN 的工作原理。 [SQL]

    我想知道是否有人可以帮助我提高对 SQL 中 JOIN 的理解 如果它对问题很重要 我会特别考虑 MS SQL Server 取 3 个表 A B A 通过某些 A AId 与 B 相关 和 C B 通过某些 B BId 与 C 相关 如果
  • If Else 条件的 SQLite 语法

    我正在使用 SQLite 数据库 我的表有一个名为 密码 的文本列 早些时候 为了检索我用来执行简单操作的值select from myTable询问 但现在的要求是 如果Password值不是NULL那么我需要将其显示为 是 或 否 它是
  • Sql批量复制截断小数

    当我使用批量复制将十进制值从 C DataTable 插入 Sql Server 2005 时 值会被截断而不是四舍五入 DataTable 中的数据类型为 Decimal 数据库中的数据类型为Decimal 19 3 数据表中的值为 1
  • 选择两列中两个日期之间的记录

    如何选择两列中两个日期之间的记录 Select From MyTable Where 2009 09 25 is between ColumnDateFrom to ColumnDateTo 我有一个日期 2009 09 25 我喜欢选择
  • Solr 增量导入不起作用

    我使用的是solr 4 2 请注意 完全导入有效 但增量导入却无效 增量导入不会给出任何错误 但不会获取任何更改 这是数据配置文件
  • 常量值如何影响连接的 ON 子句?

    我最近发现 LEFT JOIN 的 ON 子句可能包含 1 1 等值 这让我感到不安 因为它打破了我对连接功能的看法 我遇到过以下情况的更详细版本 SELECT DISTINCT Person ID FROM Person LEFT JOI
  • 如何限制两个表之间一对多关系中的多个数量?

    我有一个带有两个 MySql 表的 MySQL 数据库 第一个是第一个表 表 A 有一列具有唯一值 从值 从 1 到 n 在第二个表 2 表 B 中 我有两列 在第一个表中我有一个名称 在第二个我的值从 1 到 n 如果我在 中添加一个值
  • 在数据库中存储类型时的最大 MIMEType 长度

    人们在数据库中使用什么作为 MIMEType 字段的长度 到目前为止我们看到的最长的是 72 字节 application vnd openxmlformats officedocument wordprocessingml documen

随机推荐

  • NEAT 错误 - AttributeError:“tuple”对象没有属性“connections”

    我目前正在尝试创建一个 NEAT 算法来解决 FlappyBird 但在运行我的代码时遇到错误 参见标题 目前我已经设置了我的run功能和我的eval genomes功能 我已经简化了它们以删除pygame并试图将其保留在neat pyth
  • 如何使用vba禁用单元格中的更改?

    我正在使用以下代码 此代码的示例如下 如果我在单元格 A1 中输入任何值 单元格 B1 将显示时间戳 Private Sub Worksheet Change ByVal Target As Excel Range With Target
  • “单例”工厂,好还是坏?

    我有很多 抽象 工厂 它们通常作为单例实现 通常是为了方便 不必将它们传递给实际上与使用或了解这些工厂无关的层 大多数时候我只需要在启动时决定哪个工厂实现其余的代码程序 也许通过一些配置 它看起来例如喜欢 abstract class Co
  • 使用 Mips Assembly 读取和打印 txt 文件中的内容

    我正在尝试读取并打印 txt 文件中的内容 稍后我还想从 mips 读取转储的文件 我看到代码 看起来没问题 但没有输出任何内容 data myFile asciiz teste txt filename for input buffer
  • 从 RecyclerView 中删除行

    我在这篇文章的帮助下以某种方式实现了 recyclerview 现在我的要求是在运行时从此回收视图中删除一行 link http treyrobinson net blog android l tutorials part 3 recycl
  • 首先使用 Entity Framework 6.0 代码创建与 LINQPad 的 DbContext 连接时出现问题

    我正在使用 LINQPad v4 51 03 并尝试从 Entity Framework 6 0 6 1 1 中的代码优先实现创建 DbContext 连接 public partial class MyEntities DbContext
  • Google Apps 脚本 - 单元格中的 .setValue 基于 for 循环匹配

    我试图从数据范围中获取值 循环数据 匹配该数据中的值 然后根据匹配值更新位于几列上方的单元格 我能够找到要匹配的值 但我很难理解如何更新几列的单元格 下面是我到目前为止得到的代码 减去 setValue 部分 var trackingSS
  • 数据表中的条件差异计算

    我有一百万行长data table大约有20个柜台式的柱子 这些列显示各种存储系统操作的计数器随时间的增加 然而 有时 受监控系统上的计数器会重置 并且单个观测值低于前一个观测值 我需要计算一个opsdiff列 其中包含基于列的相同类型的后
  • iOS MKMapView 缩放以显示所有标记

    我正在与MKMapView并在地图上标出了几个点 我已经用过MKCoordinateRegion and MKCoordinateSpan围绕其中一个点启用缩放等 但这不是我想要的 我正在尝试使用类似于 Javascript 缩放到边界功能
  • 如何在 Go 中编写多行字符串?

    Go 是否有类似于 Python 的多行字符串的东西 line 1 line 2 line 3 如果不是 那么编写跨多行字符串的首选方式是什么 根据语言规范 http golang org doc go spec html String l
  • 如何在 Scala/Spark 中从多个 DataFrame 创建包含多个工作表的 Excel 文件?

    In Scala Spark应用程序我创建了两个不同的DataFrame 我的任务是为每个 DataFrame 创建一个包含两个工作表的 Excel 文件 我决定使用火花Excel https github com crealytics s
  • 包含非托管对象的 ConcurrentBag 的完成

    我在正确处理 Dispose Finalization 时遇到问题ConcurrentBag包含非托管对象 运行下面的代码 通常 会产生一个ObjectDisposedException Cannot access a disposed o
  • 在 SwiftUI 中切换视图的最佳方式是什么?

    我尝试了几种在 SwiftUI 中切换视图的选项 然而 每一个都存在一些问题 比如多次来回切换时会出现时间滞后等问题 我正在尝试找到使用 SwiftUI 切换视图的最佳和最干净的方法 我只是想制作一个多视图用户界面 In View1 swi
  • 预定的网络作业

    我正在创建一个新的 Azure WebJob 项目 它似乎是可以作为 Web 作业运行的控制台应用程序的优化版本 我希望这项工作根据时间表运行 但在Main 方法 见下文 微软为您提供了host RunAndBlock 使作业能够连续运行
  • 在 iOS 中创建 RTF 、 DOC 或 DOCX

    我想使用 iOS 应用程序创建以下文件类型之一 RTF DOC 或 DOCX 用户应该能够写文字并且添加图像到它 UI 的构建不是问题 问题只是文件的创建 有没有最佳实践可以做到这一点 第三方框架是一种选择 但我想自己做 Thanks 我可
  • 即使捕获了鼠标,如何才能获取鼠标位置的元素?

    有没有办法获取鼠标位置的元素 我正在使用 Mouse DirectlyOver 仅当鼠标未被捕获时它才能正常工作 如果鼠标被捕获 它会获取鼠标捕获的元素 该元素不一定是鼠标所在位置的元素 事实上 MSDN 文档说 如果某个元素具有鼠标捕获功
  • 哪个是好的开源用户管理系统? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 将 UIView 中的位置转换为 SKScene

    我想在 UIView 中使用 touchBegan 功能 并且应该触发 SKScene 方法 一切都几乎正常 除了我的 SKNode 的起始位置与 UIView 中的触摸不同之外 我在这里读到 Swift 中令人困惑的反向触摸事件 http
  • 查找 3 个输入的最大值 VBA

    我正在尝试找到最多 3 个输入 问题不在于算法 因为当我在 python 中制作相同的脚本时 它工作得很好 问题是它没有按预期工作 我将写一些场景以及结果 8 5 12 最多 125 8 12 最多 1212 5 8 最多 812 8 5
  • 用于选择首选糖果的高效 SQL 2000 查询

    我希望我能想出一个更具描述性的标题 如果您能说出我要询问的查询类型 请建议一个或编辑这篇文章 数据库 SQL Server 2000 示例数据 假设 500 000 行 Name Candy PreferenceFactor Jim Cho