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)
SELECT DATE(CURRENT_TIMESTAMP)
SELECT TRUNC(CURRENT_TIMESTAMP)
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