gpt4 book ai didi

sql - 在 SQL 中重新创建移动中位数和移动模式 Excel 公式

转载 作者:行者123 更新时间:2023-12-04 20:03:31 26 4
gpt4 key购买 nike

我正在尝试重新创建下面的 Excel 公式/表格并显示 True/False,但被卡住了。
Excel公式: =ABS(ROUND(MEDIAN(C$2:C2),0)-ROUND(MODE.SNGL(C$2:C2),0))<[sample.xlsx]变量!$B$2
我有 200 多行数据,我只需要从第一行到当前行计算的中位数和众数。我可以为 SQL 中的所有行创建中位数,但这不符合我的需要。与模式相同。上面的公式将在 Excel 单元格 D2 中并向下填充。它在公式末尾调用的变量只是数字 4 .
任何建议或指示都会很棒。谢谢!
Excel 片段:
Quick view of how this table looks in Excel
在 SQL 中构建这个精确表的 SQL 代码。

    IF NOT EXISTS (
select * from sysobjects where name='SampleExample' and xtype='U'
) CREATE TABLE SampleExample (
[Seconds] INT,
[Sequence] INT,
[Value] NUMERIC(12, 9),
[Result] NVARCHAR(4)
);
INSERT INTO SampleExample VALUES
(598,1,236.888453364,N'#N/A'),
(740,2,236.888453364,N'True'),
(885,3,235.463708639,N'True'),
(1024,4,236.177295446,N'True'),
(1189,5,236.177295446,N'True'),
(1330,6,236.866638064,N'True'),
(1463,7,236.177295446,N'True'),
(1599,8,236.866638064,N'True'),
(1735,9,236.866638064,N'True'),
(1863,10,236.866638064,N'True'),
(1986,11,236.866638064,N'True'),
(2110,12,236.866638064,N'True'),
(2235,13,236.880749464,N'True'),
(2362,14,236.908763647,N'True'),
(2487,15,236.908763647,N'True'),
(2610,16,236.908763647,N'True'),
(2739,17,237.190827727,N'True'),
(2865,18,237.190827727,N'True'),
(3008,19,237.190827727,N'True'),
(3132,20,237.190827727,N'True');
当前中值查询。我在我的 SQL 表中添加了一个名为 Filename 的列,该列对于所有行都是相同的值。但这会找到平板电脑中所有行的中位数,而不是从第 1 行到当前行。
Declare @Median AS INT
Select @Median = (
(Select MAX([Value])
FROM
(Select TOP 50 PERCENT [Value], [Filename]
FROM SampleExample

Order by [Filename]) as BOTTOMHALF)
+
(Select MIN([Value])
FROM
(Select TOP 50 PERCENT [Value], [Filename]
FROM SampleExample

Order by [Filename] desc) as TOPHALF) ) / 2
当前模式查询:
Declare @Mode as INT
Select @Mode = (
Select TOP 1 ROUND([Value],0) as MODE
from SampleExample
Group by [Value]
Order by COUNT(*) DESC
)
我正在寻找的结果是真/假。我在我的 SQL 查询中使用 CASE:
CASE WHEN @Variable > @Median - @Mode THEN 'True' ELSE 'False' END AS Result

最佳答案

SQL Server(和一般的 SQL)具有计算中位数的功能。它具有直观的名称 percentile_cont() .而且,它只作为窗口函数存在,而不是聚合函数。
你想要一个运行中位数。理想情况下,最好这样写:

select se.*,
avg(value) over (order by sequence) as avg_value,
percentile_cont(0.5) over (within group order by sequence) over (order by sequence)
from sampleexample se;
但不支持累积中位数。所以,剩下 apply选项:
select se.*, se2.*
from sampleexample se cross apply
(select top (1) percentile_cont(0.5) within group (order by value) over () as median,
avg(value) over () as avg_value
from sampleexample se2
where se2.sequence <= se.sequence
) se2;
Here是一个 db<>fiddle。
编辑:
我真的把这个问题理解为中位数和平均值,而不是中位数和众数(我希望阅读)。对于该模式,您确实需要一个子查询,因此:
select se.*, se2.*
from sesampleexample se cross apply
(select top (1) percentile_cont(0.5) within group (order by value) over () as median,
avg(value) over () as avg_value,
value as mode
from (select se2.*, count(*) over (partition by se2.value) as value_cnt
from sampleexample se2
where se2.sequence <= se.sequence
) se2
order by se2.value_cnt desc
) se2

关于sql - 在 SQL 中重新创建移动中位数和移动模式 Excel 公式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63972747/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com