2013-02-27 8 views
0

끝 부분의 예는 내 질문에 대한 설명입니다. 어떤 도움을 주셔서 감사합니다, 감사합니다!MySQL은 여러 그룹 기준의 평균 데이터를 추출합니다.

다른 전압 및 전류 값 중에서 몇 가지 데이터 열을 포함하는 표가 있습니다.

이러한 인스턴스는 전류가 흐를 때마다 초 단위로 기록됩니다. 이 값들로부터 대략 kJkW을 계산하고 싶습니다.

기본적으로 나는 하나 개의 테이블, instances, 즉이 포함되어 있습니다 :

  • instanceID,
  • location
  • ,
  • current
  • ,
  • voltage
  • ,
  • time.

그리고 또 하나, sets, 즉 포함

  • instanceID,
  • setID.

instanceID은 동일하고, 인스턴스의 instanceID은 세트를 가리키는 FK입니다. 인스턴스의 모든 위치에 대해 약 23 행 (다양 함)이 있습니다. 30 개 지점이 있습니다. 그래서 인스턴스에 위치 1, 위치 2에 대해 동일한 인스턴스에 대해 23 개의 행이 있습니다. 시간은 측정 된 데이터가 기록 된 시간을 기록한 시간입니다 (따라서 23 개의 모든 인스턴스간에 차이가 1 초인 경우 첫 번째와 마지막 시간의 차이는 23 초입니다).

평균을 계산하려면 kW이고 합계는 kJ (근사치)입니다. 내가 무슨 짓을했는지

은 다음

SELECT instances.instanceID, location, current, 
     voltage, current * voltage AS kW, 
     COUNT(IF(current > 0 AND voltage > 0, 
       instances.instanceID, 
       0)) AS InstancedTime 
FROM instances 
INNER JOIN sets ON instances.instanceID = sets.instanceID 
WHERE sets.setID = arbitrary_number; 
문제는 내가 다음 표 얻을 발생

:

instanceID, location, current, voltage, kW, InstancedTime

kW는 23 일에서 임의의 번호입니다 집합은 괜찮습니다. 어쨌든 근사값이기는하지만, COUNT(IF())ALL 인스턴스를 인스턴스 테이블에서 계산합니다. 모든 위치의 인스턴스.

내가 MAX(CAST(time AS SIGNED)) - MIN(CAST(time AS SIGNED))을 시도하지만이 마지막 위치 뺀 위치의 최소 시간에서 최대 시간이 걸립니다, 나는 한 번에 하나 개의 위치로 분리합니다.

내가 원하는 것은 총 전력에 그 시간의 kW를 곱한 시간이 될 kJ입니다. 나는 시간이 항상 인스턴스 사이에 1 초임을 알고 있기 때문에 개별 위치에 대한 인스턴스의 수를 계산하고 kW으로 곱하기에 충분해야하지만 모든 인스턴스에 대해 내에서 세트로 설정하고 싶습니다. 모든 개별 인스턴스에 대해 하나의 쿼리를 사용하여 세트를 대체 할 수는 있지만, 이는 곧 발생할 수 있습니다. 나는에 대한 같은 일을,

instanceID, location, current, voltage, kW, InstancedTime 
1, 1, 500V, 2A, 1kW, 1s 
1, 1, 500V, 2A, 1kw, 1s 
1, 2, 400V, 3A, 1.2kW, 1s 
1, 2, 400V, 3A, 1.2kW, 1s 
2, 1, 700V, 2A, 1.4kW, 1s 
2, 1, 700V, 2A, 1.4kw, 1s 
2, 2, 300V, 3A, 0.9kW, 1s 
2, 2, 300V, 3A, 0.9kW, 1s 

과 같은 테이블을 그리고 ID 1 위치 1과 위치 2되었다는 인스턴스의 수를 요약 할 것 kJ를 추가하기 위해 노력하고있어

같을 것이다 ID 2 모두 하나 개의 테이블이 제시 :

instanceID, location, current, voltage, kW, SumInstancedTime, kJ 
1, 1, 500V, 2A, 1kW, 2s, 2kJ 
1, 2, 400V, 3A, 1.2kW, 2s, 2.4kJ 
2, 1, 700V, 2A, 1.4kW, 2s, 2.8kJ 
2, 2, 300V, 3A, 0.9kW, 2s, 1.8kJ 

이 시간 내 주셔서 감사합니다, 어떤 제공하는 도움에 감사드립니다!

답변

1

지금은 내 대답을 테스트 할 수 있지만, 그것은 당신이 필요로하는 것은 GROUP BY이라고 소리 :

다음 쿼리는 예는 해당 인스턴스/위치하고 계산의 모든 세트에 대한 평균하여 전류 및 전압 값

SELECT instances.instanceID, location, AVG(current) as avg_current, 
     AVG(voltage) as avg_voltage, AVG(current) * AVG(voltage) AS kW, 
     COUNT(IF(current > 0 AND voltage > 0, 
       instances.instanceID, 
       0)) AS InstancedTime 
FROM instances 
INNER JOIN sets ON instances.instanceID = sets.instanceID 
WHERE sets.setID = arbitrary_number; 
GROUP BY instances.instanceID, location 
+0

이것은 정말 효과적이었습니다! 나는 당신이 제약 조건에 의해 여러 그룹을 사용할 수 있다는 것을 몰랐다. 유일하게 작동하지 않는 것은 avg_current * avg_voltage AS kW였습니다. MySQL이 두 번째 쿼리에서 계산 된 평균을 사용하는 방법을 이해하지 못하는 것 같기 때문입니다. 나는 AVG_current 대신 AVG (전류) * AVG (전압)를 사용하여 해결했다. 고마워요! – MagneTism

+0

그것은 기뻤습니다. 언급 한 수정 내용을 반영하도록 답변을 편집 중입니다. – cfrag

0

다음은 테이블에서 연속적인 행을 그룹화하려는 예제입니다. 당신의 예에서, 그것들은 삽입되지 않았지만 나는 그것이 가능할 것이라고 추측하고 있습니다. 동일한 인스턴스 ID와 위치를 가진 모든 것을 동일한 그룹에 할당해야합니다.

내 접근 방식은 다음으로 높은 인스턴스/위치 쌍을 찾고이를 그룹 식별자로 지정하는 것입니다. 하위 쿼리를 사용하여이 작업을 수행합니다. 이 식별자가 있으면 각 그룹을 요약하면됩니다 :

select i.instanceId, i.location, i.current, i.volate, i.kw, COUNT(*) as SumTime, 
     SUM(kw) as KJ 
from (select i.*, 
      (select concat(i2.instanceId, ',', i2.location) 
       from instances i2 
       where i2.instanceId > i.instanceId or (i2.instanceId = i.instanceId and i2.location > i.location) 
       order by i2.instanceId desc, i2.locationId desc 
       limit 1 
      ) as grouping 
     from instances i 
    ) i 
group by grouping