给定下表,我需要生成一个结果,显示所选范围的可用性。可用性规则规定了X,?,'',Y的顺序。例如,给定以下数据集:
+------------+--------------+------+
| date | availability | id |
+------------+--------------+------+
| 2015-09-01 | X | 1 |
| 2015-09-02 | X | 1 |
| 2015-09-03 | X | 1 |
| 2015-09-04 | X | 1 |
| 2015-09-01 | X | 2 |
| 2015-09-02 | ? | 2 |
| 2015-09-03 | X | 2 |
| 2015-09-04 | X | 2 |
| 2015-09-01 | '' | 3 |
| 2015-09-02 | Y | 3 |
| 2015-09-03 | Y | 3 |
| 2015-09-04 | Y | 4 |
| 2015-09-01 | Y | 4 |
| 2015-09-02 | Y | 4 |
| 2015-09-03 | Y | 4 |
| 2015-09-04 | Y | 4 |
+------------+--------------+------+
我想要的输出是:
+--------------+------+
| availability | id |
+--------------+------+
| X | 1 |
| ? | 2 |
| '' | 3 |
| Y | 4 |
+--------------+------+
我知道如果我在处理数值,我可能会使用MIN
MAX
等等。我的问题是,SQL是否给了我一种简单的方法来定义自定义聚合或比较器函数来实现这种逻辑?
如果不同的供应商对此有不同的解决方案,我将使用Azure SQL。
发布于 2015-09-12 06:15:51
只需使用优先级逻辑:
select ids.id, a.availability
from (select distinct id from table t) ids cross apply
(select top 1 availability
from table t2
where t2.id = t.id
order by (case when availability = 'X' then 1
when availability = '?' then 2
when availability = '' then 3
when availability = 'Y' then 4
else 5
end)
) a;
如果您有一个单独的ids表,则应该使用该表而不是子查询。
还有其他方法;但是,我能想到的方法需要更复杂的case
语句、两个连接或更复杂的SQL语句。您不需要“自定义聚合”。你只需要弄清楚如何对结果进行优先排序。
https://stackoverflow.com/questions/32532811
复制相似问题