Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 这样一个简单的预先计算cte的通风。我不认为像“precalc”或“aggr”这样的东西会更好:)顺便说一句,我愿意接受建议:) TEST_ID TEST_VALUE GROUP_ID 1 5 1 2 10 _Sql_Postgresql - Fatal编程技术网

Sql 这样一个简单的预先计算cte的通风。我不认为像“precalc”或“aggr”这样的东西会更好:)顺便说一句,我愿意接受建议:) TEST_ID TEST_VALUE GROUP_ID 1 5 1 2 10

Sql 这样一个简单的预先计算cte的通风。我不认为像“precalc”或“aggr”这样的东西会更好:)顺便说一句,我愿意接受建议:) TEST_ID TEST_VALUE GROUP_ID 1 5 1 2 10 ,sql,postgresql,Sql,Postgresql,这样一个简单的预先计算cte的通风。我不认为像“precalc”或“aggr”这样的东西会更好:)顺便说一句,我愿意接受建议:) TEST_ID TEST_VALUE GROUP_ID 1 5 1 2 10 1 3 15 1 4 25 2 5 35 2 6 5 2 7 15 2 8

这样一个简单的预先计算cte的通风。我不认为像“precalc”或“aggr”这样的东西会更好:)顺便说一句,我愿意接受建议:)
TEST_ID TEST_VALUE  GROUP_ID
1       5           1
2       10          1
3       15          1
4       25          2
5       35          2
6       5           2
7       15          2
8       25          3
9       45          3
10      55          3
11      15          3
12      5           3
13      25          3
14      45          4
GROUP_ID    AVG
1           10
2           15
3           21.6
4           45
SELECT CASE WHEN NUMBER_FIRST_GROUP <> 0 
               THEN SUM_FIRST_GROUP / NUMBER_FIRST_GROUP 
               ELSE NULL
       END AS AVG_FIRST_GROUP,
       CASE WHEN NUMBER_SECOND_GROUP <> 0 
               THEN SUM_SECOND_GROUP / NUMBER_SECOND_GROUP 
               ELSE NULL
       END AS AVG_SECOND_GROUP,
       CASE WHEN NUMBER_THIRD_GROUP <> 0 
               THEN SUM_THIRD_GROUP / NUMBER_THIRD_GROUP 
               ELSE NULL
       END AS AVG_THIRD_GROUP,
       CASE WHEN NUMBER_FOURTH_GROUP <> 0 
               THEN SUM_FOURTH_GROUP / NUMBER_FOURTH_GROUP 
               ELSE NULL
       END AS AVG_FOURTH_GROUP
FROM (
      SELECT 
         SUM(CASE WHEN GROUP_ID = 1 THEN 1 ELSE 0 END) AS NUMBER_FIRST_GROUP,
         SUM(CASE WHEN GROUP_ID = 1 THEN TEST_VALUE ELSE 0 END) AS SUM_FIRST_GROUP,
         SUM(CASE WHEN GROUP_ID = 2 THEN 1 ELSE 0 END) AS NUMBER_SECOND_GROUP,
         SUM(CASE WHEN GROUP_ID = 2 THEN TEST_VALUE ELSE 0 END) AS SUM_SECOND_GROUP,
         SUM(CASE WHEN GROUP_ID = 3 THEN 1 ELSE 0 END) AS NUMBER_THIRD_GROUP,
         SUM(CASE WHEN GROUP_ID = 3 THEN TEST_VALUE ELSE 0 END) AS SUM_THIRD_GROUP,
         SUM(CASE WHEN GROUP_ID = 4 THEN 1 ELSE 0 END) AS NUMBER_FOURTH_GROUP,
         SUM(CASE WHEN GROUP_ID = 4 THEN TEST_VALUE ELSE 0 END) AS SUM_FOURTH_GROUP
     FROM TEST
     ) AS FOO
select  
  group_id,
  avg(test_value)
from (
  select 
    t.group_id, 
    convert(decimal,t.test_value) as test_value, 
    row_number() over (
      partition by t.group_id
      order by t.test_value
    ) as ord,
    g.gc
  from
    test t
    inner join (
      select group_id, count(*) as gc
      from test
      group by group_id
    ) g
      on t.group_id = g.group_id
  ) a
where
  ord >= case when gc <= 3 then 1 when gc % 2 = 1 then gc / 2 else (gc - 1) / 2 end
  and ord <= case when gc <= 3 then 3 when gc % 2 = 1 then (gc / 2) + 2 else ((gc - 1) / 2) + 2 end
group by
  group_id
SELECT A.group_id, avg(A.test_value) AS avg_mid3 FROM
  (SELECT group_id,
         test_value,
         row_number() OVER (PARTITION BY group_id ORDER BY test_value) AS position
      FROM test) A
JOIN
  (SELECT group_id,
         CASE
           WHEN count(*) < 4 THEN 1
           WHEN count(*) % 2 = 0 THEN (count(*)/2 - 1)
           ELSE (count(*) / 2)
         END AS position_start,
         CASE
           WHEN count(*) < 4 THEN count(*)
           WHEN count(*) % 2 = 0 THEN (count(*)/2 + 1)
           ELSE (count(*) / 2 + 2)
         END AS position_end
         FROM test GROUP BY group_id) B
  ON A.group_id=B.group_id 
  AND A.position >= B.position_start 
  AND A.position <= B.position_end
GROUP BY A.group_id
SELECT group_id,
       avg( test_value )
FROM (
  select t.*,
         row_number() over (partition by group_id order by test_value ) rn,
         count(*) over (partition by group_id  ) cnt
  from test t
) alias 
where 
   cnt <= 3
   or 
   rn between floor( cnt / 2 )-1 and ceil( cnt/ 2 ) +1
group by group_id
;
with cte as (
    select
        *,
        row_number() over(partition by group_id order by test_value) as rn,
        count(*) over(partition by group_id) as cnt
    from test
)
select
    group_id, avg(test_value)
from cte
where
    cnt <= 3 or
    (rn >= cnt / 2 - 1 and rn <= cnt / 2 + 1)
group by group_id
order by group_id