SQLITE의 위치 절에서 집계 기능
-
23-08-2019 - |
문제
간단히 말해서, 나는 무엇보다도 타임 스탬프를위한 열이있는 테이블이 있습니다. 가장 최근 (예 : 가장 큰 가치) 타임 스탬프로 행을 얻고 싶습니다. 현재 나는 이것을하고있다 :
SELECT * FROM table ORDER BY timestamp DESC LIMIT 1
그러나 나는 오히려 다음과 같은 일을 많이 할 것입니다.
SELECT * FROM table WHERE timestamp=max(timestamp)
그러나 sqlite는이 쿼리를 거부합니다.
SQL error: misuse of aggregate function max()
그만큼 선적 서류 비치 이 동작을 확인합니다 (페이지 하단) :
집계 함수는 일부 명령문에서만 사용될 수 있습니다.
내 질문은 : 선택을 주문하고 반환 된 행의 수를 1로 제한하지 않고 가장 큰 타임 스탬프로 행을 얻기 위해 쿼리를 작성할 수 있습니까? 이것은 가능한 것처럼 보이지만 내 SQL-FU가 스너프에 맞지 않는 것 같습니다.
해결책
SELECT * from foo where timestamp = (select max(timestamp) from foo)
또는 SQLITE가 하위 선택을 세트로 취급해야한다고 주장하면
SELECT * from foo where timestamp in (select max(timestamp) from foo)
다른 팁
고양이를 피부하는 방법에는 여러 가지가 있습니다.
자동 증가 기능이있는 ID 열이있는 경우, TimeStamp 열에 인덱스를 넣으려면 열의 인덱싱으로 인해 ID로 마지막 레코드를 반환하면 더 빠른 쿼리가 발생합니다.
SELECT * FROM TABLE ORDER BY ID DESC LIMIT 1
지난 주 에이 질문에 5 번이 질문에 5 번 대답했다고 생각하지만 지금 당장 그 중 하나에 대한 링크를 찾기에는 너무 피곤해서 여기에 다시 ...
SELECT
*
FROM
table T1
LEFT OUTER JOIN table T2 ON
T2.timestamp > T1.timestamp
WHERE
T2.timestamp IS NULL
당신은 기본적으로 다른 행이 그보다 늦게 일치하지 않는 행을 찾고 있습니다.
참고 : 주석에서 지적한 바와 같이,이 방법은 이런 종류의 상황에서는 잘 수행되지 않습니다. 일반적으로 각 고객의 마지막 행을 원하는 상황에서는 일반적으로 (최소한 SQL Server의 경우) 더 잘 작동합니다 (예 : 예를 들어).
당신은 단순히 할 수 있습니다
테이블에서 *, max (timestamp)를 선택하십시오
편집하다:집계 기능을 사용할 수 없으므로 오류가 발생합니다. 나는 무엇을 추측한다 Squarecog 가장 좋은 일이라고 제안했습니다
SELECT * FROM table WHERE timestamp = (select max(timestamp) from table)