3

次のようなテーブルがあります。

date(timestamp) Error(integer)   someOtherColumns

特定の日付のすべての行を選択するクエリがあります。

SELECT * from table
WHERE date::date = '2010-01-17'  

ここで、Error が 0 (その日から) に等しいすべての行をカウントし、それを (その日から) すべての行の数で割る必要があります。

したがって、結果は次のようになります

Date(timestamp)      Percentage of failure
2010-01-17           0.30

データベースはかなり大きく、数百万行です..

そして、誰かがこれをより多くの日に行う方法を知っていれば素晴らしいでしょう-ある日から別の日への間隔。

Date(timestamp)      Percentage of failure
2010-01-17           0.30
2010-01-18           0.71
and so on
4

4 に答える 4

3

これを試して

select cast(data1.count1 as float)/ cast(data2.count2 as float) 
 from (
select count(*) as count1 from table date::date = '2010-01-17' and Error = 0) data1, 

(select count(*) as count1 from table date::date = '2010-01-17') data2
于 2013-10-21T13:02:26.530 に答える
1
SELECT date
     , round(count((error = 0) OR NULL) / count(*)::numeric, 2) AS percent_fail
FROM   tbl
GROUP  BY 1
ORDER  BY 1;

これは、可能な場合でも機能しerrorますNULL

-> SQLfiddle デモ。

この密接に関連する質問の下で、さらに多くの(パフォーマンスへの影響を含む):
同じSELECT sqlクエリでSUM()からパーセントを計算する

dba.SE に関するこの関連する回答でカウントする方法の比較とベンチマーク。

于 2013-10-21T17:07:13.310 に答える
0

generate_series を使用して、そこから取得できます。

このような:

WITH CTE AS 
(
     SELECT 
         m
        --,extract('year'  FROM m) AS theyear
        --,extract('month' FROM m) AS themonth
        --,extract('day' FROM m) AS theday

        ,(SELECT COUNT(*) AS cnt FROM  table WHERE date::date = m AND Error = 1) AS data1 
        ,(SELECT COUNT(*) AS cnt FROM  table WHERE date::date = m) AS data2 
    FROM  
    (
        SELECT generate_series('2012-04-01'::date, '2016-01-01'::date, interval '1 day') AS m
    ) AS g 
) -- END OF CTE 

SELECT 
      m
     ,COALESCE(data1 * 100.0 / NULLIF(data2, 0.0), 0.0) AS ErrorPercentage
FROM CTE

詳細については、こちらを参照してください: DO ブロックで選択クエリを実行するには?

于 2013-10-21T12:58:40.297 に答える