第二高的专栏
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第二高的专栏相关的知识,希望对你有一定的参考价值。
我看到一个类似的问题问How to get second highest value among multiple columns in SQL ...但是该解决方案不适用于Microsoft Access(Row_Number / Over Partition在Access中无效)。
我的Access查询包含许多字段。我想创建一个新的字段/列,它将返回查询中包含的10个特定列的第二个最高值,我将此字段称为“Cover”。像这样的东西:
Product Bid1 Bid2 Bid3 Bid4 Cover
Watch 104 120 115 108 115
Shoe 65 78 79 76 18
Hat 20 22 19 20 20
我可以做一个非常长的SWITCH
公式,如下面的等效Excel公式:
IF( AND(Bid1> Bid2, Bid1 > Bid3, Bid1 > Bid4), Bid1,
AND(Bid2> Bid1, Bid2 > Bid3, Bid2 > Bid4), Bid2,
.....
但必须有一个更有效的解决方案。如果MS-Access Query具有这样的功能,那么MAXIF
等价物将完美地工作。
有任何想法吗?先感谢您。
答案
如果数据以更多的normalized way布局,这将更容易。线索是编号的字段名称。
您的数据目前被组织为Pivot(在Access中称为crosstab),但很容易就是Unpivoted。
如果以更规范化的方式放置,这些数据将更容易使用,这种情况将是:
Product Bid Amount
--------- ----- --------
Watch 1 104
Watch 2 120
Watch 3 115
Watch 4 108
Shoe 1 65
Shoe 2 78
Shoe 3 79
Shoe 4 76
Hat 1 20
Hat 2 22
Hat 3 19
Hat 4 20
这种方式查询变得更简单。
看起来您想要按产品分组的最高出价,因此:
select Product, max(amount) as maxAmount
from myTable
group by product
实际上,我们不应该存储文本字段,因此Product应该是一个ID号,相关的产品名称在一个单独的表中存储一次,而不是在这个中存储几次,如:
ProdID ProdName
-------- ----------
1 Watch
2 Shoe
3 Hat
......但那是另一个教训。
一般来说,应该避免重复任何事情......这几乎就是数据库的目的......但下面的链接将解释为I. :)
- 嘎嘎:Microsoft Access Tutorial
- YouTube:DB Planning
- 微软:Database Design Basics
- 微软:Database Normalization Basics
- 维基百科:Database Normalization
以上是关于第二高的专栏的主要内容,如果未能解决你的问题,请参考以下文章