Far*_*hät 1 sql sql-server sql-server-2012
我正在努力定义SQL以查找统计上彼此接近的值列表.例如,假设我们有一张价格表,我希望所有价格相差0.25美元以内.
价格:1.00 1.25 2.00 4.00 4.50 4.75 5.00
对于上面的示例,这应该返回1.00,1.25,5.50,4.75和5.00,因为它们在列表中的另一个值的0.25内.
我不想获得原始列表,然后在代码中处理它.SQL服务器完成这项工作会更有效率.这可能吗?
尝试将表连接到自身:
declare @Values table (value float)
insert into @Values values (1),(1.25),(2),(4),(4.5),(4.75),(5)
select distinct A.Value
from @values A
inner join @Values B
on abs(A.value - B.Value) <= 0.25
and A.Value <> B.Value
Run Code Online (Sandbox Code Playgroud)
或者在另一种方法中,使用 CROSS APPLY
SELECT DISTINCT CASE WHEN N.n=1 THEN A.Value ELSE ant END
FROM @Values A
cross apply (select max(value) from @Values where Value < A.Value) B(ant)
CROSS APPLY(SELECT 1 UNION SELECT 2)N(n)
where abs(A.value - ant) <= 0.25
Run Code Online (Sandbox Code Playgroud)
而且,如果您使用的是SQL Server 2012+,则可以使用LEAD功能:
SELECT DISTINCT CASE WHEN N.n=1 THEN A.Value ELSE ant END
FROM (
SELECT Value,
LEAD(Value, 1,0) OVER (ORDER BY Value) AS Ant
FROM @Values
) A
CROSS APPLY(SELECT 1 UNION SELECT 2)N(n)
where abs(Ant - Value) <= 0.25
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
452 次 |
| 最近记录: |