我正在尝试编写一个VBA Sql Query,它将返回不同的记录,但我希望能够优先处理它返回的不同记录。在这个测试示例中,我想要为每个ID返回一个不同的记录,优先考虑年份为Senior,然后是Junior,二年级和新生,然后根据C,A,然后B的顺序对该术语进行子优先级排序。
ID Name Term Year
1 Suzy A Senior
1 Suzy B Junior
2 John C Senior
2 John B Sophomore
3 Pete A Junior
4 Carl C Freshman
5 Sally B Senior
在SQL查询中使用“Distinct”运算符时,我不知道它使用什么标准来决定返回哪条记录,或者是否可以像这样放置优先级。任何帮助将非常感激。我想我看到了一个使用“Select Case”的可能解决方案,但我并不太明白。如果这是正确的解决方案,我会很乐意使用它,但如果可能的话,我想解释它是如何工作的。
谢谢!
答案 0 :(得分:1)
假设Y是一个订购“Year”列的辅助表:
Year Order
--------- -----
Senior 1
Junion 2
Sophomore 3
Freshman 4
假设X是包含您的数据的表,并且所有行本身都是不同的(也就是说,X中没有记录,其中ID,Name,Term和Year是相同的),并且假设相同的ID意味着相同名称,反之亦然:
SELECT x1.*
FROM X x1
INNER JOIN Y y1 ON (x1.year = y1.year)
WHERE NOT EXISTS (
SELECT *
FROM X x2
INNER JOIN Y y2 ON (x2.year = y2.year)
WHERE x2.id = x1.id -- could also use "name" instead of id (as one implies the other)
AND (
y2.order < y1.order
OR (y2.order = y1.order AND x2.term < x1.term)
)
)
修改强>
我会尝试通过简化(和概括)上述方案来澄清正在发生的事情。
您要完成的是选择一组输出行,每个输出行对于给定键是唯一的。根据一些排序标准,其他列应该来自相同的基础行(输入行)。
SELECT *
FROM YourTable t1
WHERE NOT EXISTS (
SELECT *
FROM YourTable t2
WHERE t1.key = t2.key -- note that you can have composite keys connecting them with AND
AND (
-- any ordering criteria that will give some sense of
-- this instance t2 is lesser (or have more priority) than
-- the candidate instance t1
)
)
(这是一个非常基本的概念;将其读作“获得这些行,因为每个行都没有任何其他类型,比它更小)
由于您的“年份”列没有自然排序,您的问题变得更加复杂,因此我们必须发明一个。
这就是这个metatable来自:将Year映射到某些排序。
现在你必须将上面解释的一般概念应用到你的扩充表(也就是你原来的一个用我建议的metatable)。
订购标准也有一个共同语言。因为您的订单有多个级别(“按此顺序,按此划分关系”),您使用以下一般结构:
(t2.first_criteria < t1.first_criteria)
OR (t2.first_criteria = t1.first_criteria AND t2.second_criteria < t1.second_criteria)
OR (t2.first_criteria = t1.first_criteria AND t2.second_criteria = t1.second_criteria AND t2.third_criteria = t1.third_criteria)
...
(......任何其他类型,严格按照第一个标准,或者等于第一个,但严格小于第二个,或等于第一个和第二个,然后等于第三个......)