我正在进行一项任务,我没有得到正确的SQL查询。问题是:
不包括0.00美元,双周最低工资率是多少(请在答案中包含美元符号和小数点)?
我做了什么:
Select
MIN(Biweekly_high_Rate)
FROM salary_range_by_job_classification
WHERE MIN(Biweekly_high_rate)>0;
但这给了我答案为0.而0不是正确的答案然后我看了解决方案。我不明白最后一行解决方案
Select Biweekly_high_Rate
From salary_range_by_job_classification
ORDER BY LENGTH(Biweekly_high_Rate) ASC, Biweekly_high_Rate ASC;
我如何理解ORDER BY语句?
我推断biweekly_high_rate
是一个数字,但该列被定义为一个字符串。这不是好的数据库设计,因为字符串的排序与数字不同。考虑以下数字及其正确的顺序:
Numeric ordering: Alphabetical ordering:
2 11
11 110
12 12
110 2
处理此问题的一种方法是首先对长度为1的所有字符串进行排序,然后对长度为2的所有字符串进行排序,然后对长度为3的所有字符串进行排序,依此类推。然后打破每个组内的平局,按字母顺序排序。首先按长度排序,然后按值排序的解决方案实现了这一点。
但是,如果这是作者打算使用数据的方式,那么将列定义为数字而不是字符串将更为明智。它也有其他优点,例如允许列上的索引优化排序。将数字存储为数字而不是字符串也需要更少的存储空间。
令人费解的是,第二个查询声称是一个解决方案,因为它不排除0.00值,并且它没有找到最小值。我会在办公时间与导师讨论这个问题,并问为什么它被认为是解决方案。
列存储像'$0.00'
这样的字符串是否带有美元符号?这也不是传统的数据库设计,因为货币格式不应存储在数据库中。
你的第一个查询实际上更接近我给出的答案。除非您不能在WHERE子句中使用MIN()
。像MIN()
这样的聚合函数需要处理行组,但WHERE子句只能逐行工作。
这可能有效:
Select
MIN(Biweekly_high_Rate)
FROM salary_range_by_job_classification
WHERE Biweekly_high_rate>0;
但这仍然假设biweekly_high_rate
应该是一个数值。
Select Biweekly_high_Rate
From salary_range_by_job_classification
ORDER BY LENGTH(Biweekly_high_Rate) ASC, Biweekly_high_Rate ASC;
为了澄清你的要求,并扩展比尔提到的关于列的内容应该是NUMERIC基础,而不是字符串,ORDER BY基本上应用了双重排序。
首先考虑获取人员列表,并且您希望按姓氏按字母顺序排序,然后是名字。我们首先按字母顺序考虑这个相当简单的所有姓氏,然后是所有名字。但如果你有5个姓名史密斯,会发生什么。次要排序是名字。
Jones Gary
…
Smith, Adam
Smith, Betty
Smith, Joe
Smith, Nancy
Smith, Veronica
…
Walker, Tim
因此,如果列出多个字段的顺序,则在第一个字段上进行主要排序。然后,一旦对所有这些进行了排序,其中每个都在该级别进行排序,次要排序是下一个,依此类推,您可能有3个,4个甚至更多列的订单。
现在,回到你的例子。正如比尔提到的那样,它显示你的双周高速率数据是一个字符串值。因此,LENGTH(Biweekly_Hi_Rate)ASC的排序意味着FIRST按字符串表示的升序排序(因此ASC vs DESCending)。在第一级排序之后,然后按两周一次的比率排序。
因此,让我们采用以下基于STRING的速率示例和这些字符串的隐含LENGTH()。
BiWeeklyHiRate
13
5
11
9
14
2
10
相同的订单,但只显示长度。
LENGTH of string BiWeeklyHiRate
2 13
1 5
2 11
1 9
2 14
1 2
2 10
现在,如果只按双周的LENGTH()排序。请注意,每周费率首先是所有单长度费率,然后是所有2位数费率。但是在每个长度的共同点内注意,每周的费率没有排序。
LENGTH of string BiWeeklyHiRate
1 5
1 9
1 2
2 13
2 11
2 14
2 10
所以现在,SECONDARY类型的费率适用于给予
LENGTH of string BiWeeklyHiRate
1 2
1 5
1 9
2 10
2 11
2 13
2 14