SQL用于存储从冷到热的特定范围的数字?

时间:2019-07-14 19:58:40

标签: sql tsql

我们有一个表,其中列出了以下内容: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等。

3 个答案:

答案 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;