1

いくつかのトラフィック フロー データを選択し、60 秒のバケットにバケット化されたさまざまなトラフィック方向の合計を作成しようとしています。簡略化した表を以下に示します (タイムスタンプは UNIX エポックです)。

Timestamp      Source     Destination    Count
1              inside     outside          5
2              inside     outside          6
3              outside    inside           7
65             inside     inside           4
66             inside     outside          6
72             inside     outside          7

現在のクエリ (バケット化を行いますが、方向については何もありません)

SELECT sum(count) AS total FROM table GROUP BY round(timestamp/60)

これにより、次のような60秒ごとの「バケット」の合計数が得られます

Count
 18
 10
 7

さて、私が迷っているところです(クライアントコードでこれを行うことができますが、可能であればSQLでやりたいと思います)。内部がソース、宛先が外部であるすべての行に対してインバウンドと呼ばれる合計、ソースがソースで内部が宛先であるすべての行に対してアウトバウンドと呼ばれる合計、およびソースと宛先の両方が内部である内部と呼ばれる行が必要です。 . まだ 60 秒のバケットでグループ化されています。つまり、私が戻したいのは次のとおりです。

Inbound  Outbound  Internal
   7        11        0
   0         6        4
   0         7        0

私の SQL foo は弱く、どこから始めればよいか本当にわかりません (サブセレクトが必要だと思いますが、それを構築する方法がわかりません)。

4

2 に答える 2

2
SELECT
  round(timestamp/60)             AS bucket,
  SUM(
    CASE WHEN source = 'inside'  AND destination = 'outside'
         THEN count ELSE 0
    END
  )                               AS outbound,
  SUM(
    CASE WHEN source = 'outside' AND destination = 'inside'
         THEN count ELSE 0
    END
  )                               AS inbound,
  SUM(
    CASE WHEN source = 'inside'  AND destination = 'inside'
         THEN count ELSE 0
    END
  )                               AS internal
FROM
  yourTable
GROUP BY
  round(timestamp/60)
于 2012-09-19T01:53:59.230 に答える
1

実際にピボットを実行できるはずです。

SELECT SUM(count) AS total
    , SUM(CASE 
              WHEN Source = 'outside' 
                   AND Destination = 'inside' 
                   THEN count  -- Use 1 if you only want to count each row
              ELSE 0 END) AS [Inbound]
    , SUM(CASE
              WHEN Source = 'inside' 
                  AND Destination = 'outside' 
                  THEN count
              ELSE 0 END) AS [Outbound]
    , SUM(CASE 
              WHEN Source = 'inside'
                  AND Destination = 'inside' 
                  THEN count
              ELSE 0 END) AS [Internal]
FROM table 
GROUP BY round(timestamp/60)
于 2012-09-19T01:53:29.420 に答える