SQL Server Отличный запрос с несколькими условными числами

Я пытаюсь создать запрос, чтобы предоставить мне время выполнения в минутах для ряда строк данных тестирования.

Краткая версия таблицы:

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

Этот принцип вообще возможен?

Любое направление будет с благодарностью.

3 ответа

Решение

Вы можете использовать что-то вроде этого:

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)

Хотя в зависимости от вашей СУБД вам может понадобиться использовать другой метод удаления времени из даты.


Удаление времени с даты:


SQL-Server 2008 и более поздние версии:

SELECT  CAST(CURRENT_TIMESTAMP AS DATE)

SQL-Server 2005 и ранее

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

MySQL и SQLite

SELECT  DATE(CURRENT_TIMESTAMP)

оракул

SELECT  TRUNC(CURRENT_TIMESTAMP)

Postgresql

SELECT  CURRENT_TIMESTAMP::DATE

Использование синтаксиса 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)

Насколько я знаю, это невозможно сделать так. Возможно, вы могли бы сделать что-то вроде этого:

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
Другие вопросы по тегам