MS SQL SERVER 回答...
DECLARE
@min_time DATETIME,
@max_time DATETIME,
@min_price MONEY,
@max_price MONEY
SELECT
@min_time = MIN(timestamp),
@max_time = MAX(timestamp),
@min_price = MIN(price),
@max_price = MAX(price)
FROM
yourTable
SELECT
*
FROM
yourTable
ORDER BY
(CAST(DATEDIFF(second, @min_time, timestamp) AS FLOAT) / CAST(DATEDIFF(second, @min_time, @max_time) AS FLOAT)) * @slider
+
(CAST(price - @min_price AS FLOAT) / CAST(@max_price - @min_price AS FLOAT)) * (1 - @slider)
-- Where te slider value is anything between 0 and 1
为了使您的情绪发挥作用,我对 Time 和 Price 进行相同的计算 - 我将它们转换为从 0 到 1 的值(我称之为positional weight
)。
- 0.0 = 等于该字段的最小值
- 0.5 = 恰好介于该字段的最小值和最大值之间
- 1.0 = 等于该字段的最大值
然后我将位置权重乘以滑块的值(或 1 值),并将两个结果相加。
当滑块为0或1时,很简单;一个位置权重乘以一,一个位置权重乘以零。换句话说,一个位置权重不变,一个位置权重被忽略。
当滑块为 0.5 时,每个位置权重的一半相加。
在 99.999% 的值非常接近并且存在一个极端异常值的情况下,这可能会导致该字段异常占优势,或者相反。(大多数位置权重非常接近 0 或 1)
因此,一种选择是将位置权重仅基于数据顺序。因此,在许多值接近但有一个极端异常值的情况下;列表中间的值仍然是 0.5,因为它是位置权重。简而言之 - 它在序列中的位置很重要,而不是它的实际价值。
DECLARE
@count FLOAT
SELECT
@count = CAST(COUNT(*) AS FLOAT)
FROM
yourTable
WITH
ordered_data
AS
(
SELECT
ROW_NUMBER() OVER (ORDER BY timestamp) AS time_id,
ROW_NUMBER() OVER (ORDER BY price) AS price_id,
*
FROM
yourData
)
SELECT
*
FROM
ordered_data
ORDER BY
(CAST(time_id AS FLOAT) / @count) * @slider
+
(CAST(price_id AS FLOAT) / @count) * (1 - @slider)
哪个是最好的,为什么等等,开始得到统计,并且完全取决于你想要达到的目标。也许您可以取两个不同位置权重的平均值,然后使用它们?希望这能给你一些可以使用的东西。
两个答案都强制positional weight
是一个百分比。这是因为 TIME 和 PRICE 可以有截然不同的尺度。将它们设置为百分比(0 到 1)会强制它们具有相同的比例。您可能需要考虑其他机制来选择合适的尺度,并且这些机制可能因每个领域而异。
每个答案都计算出相对于固定点的位置权重:列表中的最低项目。您可能希望选择其他参考点,例如 MEAN、MODE 或 MEDIAN。这样做时,您将拥有一系列 (-x 到 +y) 的位置权重,其中 x 和 y 可能是非常不同的值。然后,您可以选择将这些重新加权为(-1 到 +1)。这将需要沿曲线缩放它们,并且您需要决定如何确定该曲线。
每个答案计算出与固定参考点的“距离”为 0 到 1,或在上一段中为 -1 到 +1。这假设 TIME 和 PRICE 始终同等重要。但是,如果您只选择了位置权重应该始终接近 1 的昂贵物品怎么办?您需要一种机制来针对“所有可能的值”而不是“所有当前值”进行扩展。
你在这里有很多选择,什么选择是对还是错取决于你提出的功能需求。我不相信有一个普遍的真理可以找到。也许您需要创建一些示例并计算出您想要发生的事情,然后计算出如何?