[SQL] 와이즈 최대
SQL와이즈 최대
나는 각 보안에 대한 최신 위치를 검색하기 위해 노력하고있는 테이블이 있습니다
탁자:
내 쿼리 테이블을 만들려면 다음 SELECT ID, 보안, 위치로부터 매입 일 WHERE CLIENT_ID = 4
+-------+----------+------------+
| id | security | buy_date |
+-------+----------+------------+
| 26 | PCS | 2012-02-08 |
| 27 | PCS | 2013-01-19 |
| 28 | RDN | 2012-04-17 |
| 29 | RDN | 2012-05-19 |
| 30 | RDN | 2012-08-18 |
| 31 | RDN | 2012-09-19 |
| 32 | HK | 2012-09-25 |
| 33 | HK | 2012-11-13 |
| 34 | HK | 2013-01-19 |
| 35 | SGI | 2013-01-17 |
| 36 | SGI | 2013-02-16 |
| 18084 | KERX | 2013-02-20 |
| 18249 | KERX | 0000-00-00 |
+-------+----------+------------+
나는이 페이지를 기반으로 쿼리 버전 덤비는 한,하지만 난 내가 찾고 결과를 얻을 수없는 것.
여기에 내가 노력했습니다 것입니다 :
SELECT t1.id, t1.security, t1.buy_date
FROM positions t1
WHERE buy_date = (SELECT MAX(t2.buy_date)
FROM positions t2
WHERE t1.security = t2.security)
하지만이 날을 반환합니다 :
+-------+----------+------------+
| id | security | buy_date |
+-------+----------+------------+
| 27 | PCS | 2013-01-19 |
+-------+----------+------------+
결과는 가장 최근의 구매 날짜가 각 보안에 대한 하나 개의 행이있을 것입니다, 그래서 나는, 각 보안에 대한 최대 / 최신 구매 날짜를 얻기 위해 노력하고있어. 어떤 도움도 대단히 감사합니다.
편집 : 위치의 ID가 최대 구매 날짜를 반환해야합니다.
해결법
-
==============================
1.이 쿼리를 사용할 수 있습니다. 당신은 75 % 짧은 시간에 결과를 얻을 수 있습니다. 나는 더 많은 데이터 세트와 함께 확인. 하위 쿼리는 시간이 더 걸립니다.
이 쿼리를 사용할 수 있습니다. 당신은 75 % 짧은 시간에 결과를 얻을 수 있습니다. 나는 더 많은 데이터 세트와 함께 확인. 하위 쿼리는 시간이 더 걸립니다.
SELECT p1.id, p1.security, p1.buy_date FROM positions p1 left join positions p2 on p1.security = p2.security and p1.buy_date < p2.buy_date where p2.id is null;
SQL-바이올린 링크
-
==============================
2.당신은 결과를 얻을 수있는 하위 쿼리를 사용할 수 있습니다 :
당신은 결과를 얻을 수있는 하위 쿼리를 사용할 수 있습니다 :
SELECT p1.id, p1.security, p1.buy_date FROM positions p1 inner join ( SELECT MAX(buy_date) MaxDate, security FROM positions group by security ) p2 on p1.buy_date = p2.MaxDate and p1.security = p2.security
데모와 SQL 바이올린을 참조하십시오
아니면 WHERE 절에를 사용할 수 있습니다 :
SELECT t1.id, t1.security, t1.buy_date FROM positions t1 WHERE buy_date = (SELECT MAX(t2.buy_date) FROM positions t2 WHERE t1.security = t2.security group by t2.security)
데모와 SQL 바이올린을 참조하십시오
-
==============================
3.이것은에 의해 간단한 그룹으로 이루어집니다. 당신은 유가 증권에 의한 그룹에 원하는 매입 일의 최대를 얻을. 는 SQL :
이것은에 의해 간단한 그룹으로 이루어집니다. 당신은 유가 증권에 의한 그룹에 원하는 매입 일의 최대를 얻을. 는 SQL :
SELECT security, max(buy_date) from positions group by security
참고이 빠른 bluefeet의 대답보다하지만 ID를 표시하지 않습니다.
-
==============================
4.@bluefeet에 의한 대답은 당신이 원하는 결과를 얻기 위해이 더 많은 방법이있다 - 첫 번째는 아마 당신의 쿼리보다 더 효율적입니다.
@bluefeet에 의한 대답은 당신이 원하는 결과를 얻기 위해이 더 많은 방법이있다 - 첫 번째는 아마 당신의 쿼리보다 더 효율적입니다.
당신이 당신의 쿼리 작업을하지 않는 것을 말하는 이유를 내가 이해하지 못하는 것은. 그것은 꽤 잘 보인다 및 예상 결과를 반환합니다. SQL-바이올린에서 테스트
SELECT t1.id, t1.security, t1.buy_date FROM positions t1 WHERE buy_date = ( SELECT MAX(t2.buy_date) FROM positions t2 WHERE t1.security = t2.security ) ;
당신이 CLIENT_ID = 4 조건을 추가 할 때 문제가 나타날 경우에만 모두를 추가 할 필요가 절하면서 하나를 추가하기 때문에, 다음입니다 :
SELECT t1.id, t1.security, t1.buy_date FROM positions t1 WHERE client_id = 4 AND buy_date = ( SELECT MAX(t2.buy_date) FROM positions t2 WHERE client_id = 4 AND t1.security = t2.security ) ;
-
==============================
5.
select security, max(buy_date) group by security from positions;
(당신이 쿼리에서 원하는 당신은 "각 x의"문구를 포함 큰 소리로 무엇을 말할 때, 당신은 아마 X에 의해 그룹을 원하는) 각 보안을 위해 최대 구매 날짜를 얻기 위해 필요한 모든 것입니다
그룹을하여 사용하는 경우, 당신의 선택해야합니다 모든 열 중 하나를 예를 들어,이 ID를 포함하고 싶었다, 그래서 만약, 당신은 아마 당신이 한 것과 유사한 하위 쿼리를 사용해야 할 것 또는 집계에 의해 그룹화 된 열 수 전에, 당신에게 너무 많은 행을 줄 것이라고하여 합리적으로 ID를 사용할 수있는 모든 집계, 또 다른 그룹이 될 것 같지 않기 때문에.
from https://stackoverflow.com/questions/15211479/groupwise-maximum by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 추가 (별개의) 필터를 집계 열 (0) | 2020.04.08 |
---|---|
[SQL] 무엇을 의미 = *는 무엇입니까? (0) | 2020.04.08 |
[SQL] SELECT 쿼리의 기본 행 순서 - SQL 2012 대 SQL 서버 2008 (0) | 2020.04.08 |
[SQL] 백틱 및 SQL 문에서 대괄호의 차이점은 무엇입니까? (0) | 2020.04.08 |
[SQL] 액세스-SQL : 내부는 여러 테이블에 가입 (0) | 2020.04.08 |