2

テストデータの行数の分単位のターンアラウンドタイムを提供するクエリを作成しようとしています。

表の簡潔なバージョンは次のとおりです。

TestName、StartDateTime、EndDateTime

そして、私は私に次のような出力を与えることができるクエリを探しています:

Distinct TestName 
, StartDate[not time]
, Count(rows) as Total
, Count(rows where datediff(minute, StartDateTime, EndDateTime) <=60) as NonBreach
, Count(rows where datediff(minute, StartDateTime, EndDateTime) >60) as Breach
, Count(rows where datediff(minute, StartDateTime, EndDateTime) >60) / Count(rows) as BreachRate

この原則は可能ですか?

どんな方向でも大歓迎です。

4

3 に答える 3

4

次のようなものを使用できます。

SELECT  TestName,
        CAST(StartdateTime AS DATE) AS StartDate,
        COUNT(*) AS Total,
        COUNT(CASE WHEN DATEDIFF(MINUTE, StartDateTime, EndDateTime) <= 60 THEN 1 END) AS NonBreach,
        COUNT(CASE WHEN DATEDIFF(MINUTE, StartDateTime, EndDateTime) > 60 THEN 1 END) AS Breach,
        1.0 * COUNT(CASE WHEN DATEDIFF(MINUTE, StartDateTime, EndDateTime) > 60 THEN 1 END) / COUNT(1) AS BreachRate
FROM    YourTable
GROUP BY TestName, CAST(StartdateTime AS DATE)

DBMSによっては、日付から時刻を削除する別の方法を使用する必要がある場合があります。


日付から時刻を削除する:


SQL-Server 2008以降:

SELECT  CAST(CURRENT_TIMESTAMP AS DATE)

SQL-Server2005以前

SELECT  DATEADD(DAY, DATEDIFF(DAY, 0, CURRENT_TIMESTAMP), 0)

MySQLSQLite

SELECT  DATE(CURRENT_TIMESTAMP)

オラクル

SELECT  TRUNC(CURRENT_TIMESTAMP)

Postgresql

SELECT  CURRENT_TIMESTAMP::DATE

于 2013-02-05T18:13:33.187 に答える
2

SQL Server 2008構文の使用(他のデータベースでは、datediffおよびcast(... as date):のメソッドがわずかに異なります。

select  TestName 
,       cast(StartDateTime as date) as StartDate
,       count(*) as Total
,       sum(case when datediff(minute, StartDateTime, EndDateTime) <= 60 
            then 1 end) as NonBreach
,       sum(case when datediff(minute, StartDateTime, EndDateTime) > 60 
            then 1 end) as Breach
,       1.0 * sum(case when datediff(minute, StartDateTime, EndDateTime) > 60 
            then 1 end) / count(*) as BreachRate
from    YourTable
group by
        TestName 
,       cast(StartDateTime as date)
于 2013-02-05T18:13:16.573 に答える
0

私の知る限り、このようにすることはできません。おそらくあなたはこのようなことをすることができます:

Select TestName 
    , StartDate[not time]
    , Count(rows) as Total
    , SUM(CASE WHEN  datediff(minute, StartDateTime, EndDateTime) <=60 THEN 1 ELSE 0 END ) as NonBreach
    , SUM(CASE WHEN datediff(minute, StartDateTime, EndDateTime) >60 THEN 1 ELSE 0 END ) as Breach
于 2013-02-05T18:15:49.603 に答える