- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是来自 Selecting the highest salary 的继续问题
假设有一个表 'wagetable'
name lowhours highhours wage priority
Default 0.0 40.0 100 0
Default 40.0 50.0 150 0
Default 50.0 70.5 154 0
Default 70.5 100.0 200 0
Brian 0.0 40.0 200 1
Brian 40.0 50.0 250 1
Brian 50.0 60.0 275 1
Brian 60.0 70.0 300 1
Brian 70.0 80.0 325 1
Brian 80.0 9999.0 350 1
Chad 0.0 40.0 130 1
Chad 40.0 9999.0 170 1
我目前每秒执行 3-4 次两种类型的查询,因此性能是关键,而不是真正的可读性(但首选)。
当且仅当 $Hour 介于 lowhours 和 highhours 之间时,此查询才选择工资:
SELECT wage
FROM wagetable
WHERE name LIKE '$Employee' OR name LIKE 'Default'
AND '$Hour' BETWEEN lowhours AND highhours
ORDER BY priority DESC
LIMIT 1
如果第一个查询未能在低点和高点之间找到 $Hour,则第二个查询将启动:
SELECT wage
FROM wagetable
WHERE name LIKE '$Employee' OR name LIKE 'Default'
ORDER BY priority DESC, highhours DESC
LIMIT 1
我想看看是否可以有一个查询,我可以将两者结合起来在一个查询中做同样的事情
编辑:
因为我没有正确测试上面的查询..我会用英语告诉你我想要什么和答案的例子。
它会检查表中是否存在 $Employee,然后使用它。如果没有,则改为检查“默认”。一旦它知道名字,它就会检查 $Hour 是否在已知的低小时和高小时之间,如果是,选择那个工资,如果它高于列出的任何东西,自动取最高小时的工资。
这里有一些值。请注意,“sam”不在表格中,因此他将是“默认”示例遵循以下格式:(姓名,时间)预期答案
(Sam, 1) 100
(Sam, 51) 154
(Sam, 999999) 200
(Brian, 1) 200
(Brian, 51) 275
(Brian, 999999) 350
这里又是表格,因此您可以快速引用,记住 Sam 将是“默认”
name lowhours highhours wage priority
Default 0.0 40.0 100 0
Default 40.0 50.0 150 0
Default 50.0 70.5 154 0
Default 70.5 100.0 200 0
Brian 0.0 40.0 200 1
Brian 40.0 50.0 250 1
Brian 50.0 60.0 275 1
Brian 60.0 70.0 300 1
Brian 70.0 80.0 325 1
Brian 80.0 9999.0 350 1
编辑 2:
这样做的目的是让您可以定义一个工资表,如果某人的收入比其他人多,他们将获得一定数额的工资加上加类费。如果是标准 worker ,则获得Default
工资。如果 $Employee
在列表中,那么他将获得特殊工资。
最低的 lowhours
将 -always- 为 0.0,lowhours
和 highhours
对将 -never- 有任何差距(它不会'不允许 40-50,然后跳过并做 60-70)。不确定的是最高 highhours
。所以是$Hour
高于$Employee
的最高highhours
,那么应该使用$Employee
最高highhours
的工资。
例如;如果“Betty Sue”工作了 200 小时,它将获得 Default
的最高 highhours
工资...即 200。因此,“Betty Sue”在她工作第 200 天时的工资hour 是每小时 200。
现在,如果 Brian 工作 10000 小时,他将不会赚取 Default
的最高 highhours
工资...但是他将赚取 Brian
的最高 highhours
工资是 350。
基准测试结果:
这是基于 2000 次查询(匹配 1000 次,默认不匹配 1000 次):
Timwi 的方法:4348 毫秒
OMG Ponie 的方法:5843 毫秒
我的方法最多使用 5 个查询且至少使用 2 个:5844 毫秒
最佳答案
我相信这是做你想做的最直接的方法:
SELECT IFNULL(
(SELECT wage FROM WAGETABLE WHERE name LIKE '$Employee'
AND '$Hour' BETWEEN lowhours AND highhours),
(SELECT wage FROM WAGETABLE WHERE name LIKE 'Default'
ORDER BY highhours DESC LIMIT 1)
)
它做你在另一个问题中描述的:
但是,我觉得我应该指出您在这个问题中发布的查询有些不同。我的查询未找到具有匹配的 lowhours/highhours 间隔的 Default 行,它只会返回具有最高 的行highhours 默认值。我不知道问题中的查询是否真的是您想要的,但似乎更有可能,因此这里有一个查询等同于您在这个问题中实际提出的问题:
SELECT IFNULL(
(SELECT wage FROM WAGETABLE WHERE (name LIKE '$Employee' OR name='Default')
AND '$Hour' BETWEEN lowhours AND highhours
ORDER BY priority DESC LIMIT 1),
(SELECT wage FROM WAGETABLE WHERE name LIKE '$Employee' OR name='Default'
ORDER BY priority DESC, highhours DESC LIMIT 1)
)
关于SQLite:结合 OR 和 AND,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3539890/
我正在开发一个 SQLite 数据库。数据库已经填满了,但我想重构它。这是我需要做的一个示例: 我目前有一张 table : CREATE TABLE Cars (ID INTEGER PRIMARY
我正在使用 Mono、SQLite、Dapper 和 Dapper 扩展。我可以从数据库中读取数据,但插入不起作用。我正在使用 sqlite 的 Mono 驱动程序。 错误并不能提供太多信息,至少对我
我有一个使用 SQLite 的 Windows Phone 8 应用程序。该应用程序具有许多数据库功能,并包含一个 sqlite 数据库文件,在运行该应用程序时,该文件将被复制到本地文件夹并进行访问。
为 sqlite 创建索引时有排序顺序。 https://sqlite.org/lang_createindex.html Each column name or expression can be
顾名思义,我怀疑如果有一些引用被删除的表会发生什么,例如表的某些字段的索引。 SQLite是否会自动处理?在执行drop命令之前,数据库所有者是否应注意任何实例? 最佳答案 我认为不需要家政服务。 S
我想知道是否有可能将从计数中获得的整数转换为REAL 类似于以下内容(尽管这不起作用) SELECT CAST (COUNT (ColumnA) AS Count) AS REAL) FROM Tab
我无法在SQLite数据库上执行一些更新。我正在Windows上使用SQLite 3 Shell。 我正在运行以下命令: update resovled_chrom_counts set genus
我知道SQLite中的触发器顺序是不确定的(您不能确定将首先执行哪个触发器),但是表约束和触发器之间的关系又如何呢? 我的意思是,假设我在一个列中有一个UNIQUE(或CHECK)约束,并且在该表上有
我的 CustomTags 表可能有一系列“临时”记录,其中 Tag_ID 为 0,并且 Tag_Number 将有一些五位数的值。 定期,我想清理我的 Sqlite 表以删除这些临时值。 例如,我可
我有A,B,C和D的记录。 我的SQL1 SELECT * FROM main_table order by main_table.date desc limit 2返回A和B。 我的SQL2 SEL
select round(836.0)返回836.0 我如何删除sqlite查询中的尾随零。 836.00应该是836 836.440应该是836.44 最佳答案 如果需要836.44,则需要十进制返
我正在研究RQDA中的文本,并且正在使用Firefox SQLite Manager访问数据库,以便可以更轻松地搜索文件。我创建并填充了虚拟表: CREATE VIRTUAL TABLE texts
我有这样的数据: table1 id | part | price 1 | ox900 | 100 2 | ox980 | 200 和 table2 id | part | price 1
我正在尝试将一些数据插入现有的SQLite表中。该表和数据库是使用相同的API创建的,但是由于某种原因,插入操作无效,并且从不给我任何错误消息。 我正在BlackBerry 9550模拟器上对此进行测
例如,我在名为SALARY的列中插入一个值。如果插入的值大于1000,我想将字符串HIGH插入到RANK列中,否则将插入LOW中。 我可以使用SQLite做到吗? 最佳答案 在插入之前使用触发器,然后
假设我有一个包含三列A,B,C的表t1,其中(A,B)包含唯一键(具有数十万行)。由于90%的查询将采用SELECT C FROM t1 WHERE A =?和B = ?,我想我要为A,B和C提供覆盖
在一个SQLite3数据库中,我有一个表“ projects”,其id字段由以下方式组成: [user id]_[user's project id] 例如,用户ID = 45,这是一些数据: 45_
我了解PRAGMA foreign_key和ON DELETE RESTRICT/NO ACTION的概念,但是我面临的是另一种情况。 我需要删除一个父行,但保持与之关联的子行。例如: CREATE
我的c#应用程序从Web服务1读取文件列表,并将完整的文件名插入table1,然后从第二个Web服务读取list并将它们插入到table2。 这些表具有相同的结构,如下所示: create table
我在以下情况下尝试将Record1的ID更新为Record2的ID: 两个表中的名称相同,并且 在Record2中权重更大。 记录1 | ID | Weight | Name | |----|----
我是一名优秀的程序员,十分优秀!