2014-07-22 6 views
0

안녕하세요. 저는 이와 같은 SQL 스크립트가 있습니다. 대본의 의도는 오늘날의 가장 높은 가치를 창출하는 것입니다. 그러나 스크립트는 의도하지 않은 결과를 산출합니다. 누구든지 내 코드를보고 그 코드의 잘못된 부분을 볼 수있게 도와 줄 수 있습니까?SQL. 최대 값을 가진 타임 스탬프 문제

스크립트

SELECT MAX(Value), 
     TIMESTAMP, 
     fooditem, 
     cashcurren 
FROM  farm1 
WHERE r.timestamp > 1405987200 
     AND r.timestamp <= (1405987200 + 86400) 
     AND fooditem = '2' 
     AND cashcurren = '10' 
GROUP BY timestamp, fooditem, cashcurren; 

의도하지 않은 결과

Value Timestamp fooditem cashcurren 

200 1406029354   2   10 
    84 1406034965   2   10 
536 1406034973   2   10 
    70 1406035006   2   10 
    63 1406035025   2   10 

내가 원하는 결과

값 타임 스탬프 fooditem

536 1406034973   2   10 

는 기본적으로 나는에 내 오라클 SQL을 원하는 cashcurren 식품 항목 2와 현금 절약 10의 가장 높은 값을 타임 스탬프 1405987200에서 1405987200 + 86400으로 되돌립니다 (타임 스탬프는이 경우 7/22의 전체 날입니다). 타임 스탬프 최대 (값) 및 그룹화를 사용하여

+0

그 결과를 보면 모든 단일 행의 타임 스탬프가 다릅니다. 각 타임 스탬프, fooditem 및 cashcurren 조합에 대한 최대 값을 선택했습니다 (그룹 별 절이 모두 3 개). 1 개가 아닌 5 개의 행이있는 이유는 해당 5 개의 행마다 다른 타임 스탬프가 있기 때문입니다. 타임 스탬프별로 그룹화했습니다. 대신 값을 내림차순으로 집계 및 정렬하거나 1을 제한하거나 인라인보기와 함께 조인을 사용하거나 하위 쿼리를 사용할 수 있습니다. –

답변

1
SELECT Value, TIMESTAMP, fooditem, cashcurren 
    FROM farm1 f 
WHERE timestamp between 1405987200 and (1405987200 + 86400) 
    AND fooditem = '2' 
    AND cashcurren = '10' 
where value = 
     (select max(x.value) 
      from farm1 x 
     where x.timestamp between 1405987200 and (1405987200 + 86400) 
      and x.fooditem = f.fooditem 
      and x.cashcurren = f.cashcurren) 

어떤 집계로 연결되지 않고 이해가되지 않습니다.

위의 쿼리는 하위 쿼리를 사용하여 지정된 타임 스탬프 범위, fooditem 및 cashcurren의 최대 값을 선택한 다음 해당 값을 where 절의 쿼리에 제공합니다.

0
SELECT MAX(Value), 
     TIMESTAMP, 
     fooditem, 
     cashcurren 
FROM  farm1 
WHERE r.timestamp > 1405987200 
     AND r.timestamp <= (1405987200 + 86400) 
     AND fooditem = '2' 
     AND cashcurren = '10' 
GROUP BY timestamp, fooditem, cashcurren 
order by 1 desc limit 1; 
0
SELECT d.Value, d.TIMESTAMP, d.fooditem, d.cashcurren 
    FROM  (SELECT MAX(Value) AS 'Value', 
        TIMESTAMP, 
        fooditem, 
        cashcurren 
      FROM  farm1 
      WHERE r.timestamp > 1405987200 
        AND r.timestamp <= (1405987200 + 86400) 
        AND fooditem = '2' 
        AND cashcurren = '10' 
      GROUP BY timestamp, fooditem, cashcurren) AS d 
    ORDER BY d.Valuse DESC limit 1;