我们有一个表,其中列出了以下内容:date,val1,val2,val3,val4,val5
对于给定的行,val1 -val5是唯一的,介于1到37之间
使用T-SQL,如何在给定的日期范围内按从冷到热的顺序列出数字1 -37?
[![在此处输入图片描述] [1]] [1]
样本输出(无效):按频率递减的数字:
36 = 0、2 = 1、5 = 1、7 = 3、34 = 5、30 = 6等。
答案 0 :(得分:1)
使用递归CTE创建数据集1-37,然后UNION ALL
创建具有表中所有数字的数据集。
加入2个数据集,并group by
的数量和总和:
with cte(n) as (
select 1 union all select (cte.n + 1) n from cte where cte.n < 37
)
select
cte.n, count(t.number) counter
from cte left join (
select date, val1 number from tablename union all
select date, val2 from tablename union all
select date, val3 from tablename union all
select date, val4 from tablename union all
select date, val5 from tablename
) t on t.number = cte.n and t.date between '2019-05-01' and '2019-05-31'
group by cte.n
order by counter, cte.n
答案 1 :(得分:0)
生成包含37个数字的表格,并保留您的数据
WITH E1(N) AS (
SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1
), --10E+1 or 10 rows
E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows
E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E+4 or 10,000 rows max
numbers(N) AS (
SELECT TOP (37) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4
)
select n.N, count(t.val)
from numbers N
left join (
select dt, val
from
-- your table here
( values
('2017-01-01', 22, 23, 4, 22, 5)
) myTable (dt, val1, val2,val3,val4,val5)
-- end of your table
cross apply (
values (val1),(val2),(val3),(val4),(val5)
) t(val)
) t on t.val = n.N
group by n.N
order by n.N;
答案 2 :(得分:0)
您需要生成一个由37个数字组成的列表(为此需要递归CTE)。
然后,如果每行中的值都是唯一的,则可以使用join
:
,其中n(n)为( 选择1作为全部n 选择(cte.n +1)作为n 来自cte cte.n <37 )
select n.n, count(t.id) counter
from n left join
t
on n.n in (t.val1, t.val2, t.val3, t.val4, t.val5)
group by n.n;
如果数字可以在一行中重复,则上面仅对行进行一次计数(它实际上对匹配的行进行计数,而不是匹配的值)。如果希望将它们分开计数,请取消枢纽。为此,我建议apply
:
select n.n, count(v.val) counter
from n left join
(t cross apply
(values (t.val1), (t.val2), (t.val3), (t.val4), (t.val5)
) v(val)
)
on n.n = v.val
group by n.n;