복붙노트

[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. ==============================

    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. ==============================

    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. ==============================

    3.이것은에 의해 간단한 그룹으로 이루어집니다. 당신은 유가 증권에 의한 그룹에 원하는 매입 일의 최대를 얻을. 는 SQL :

    이것은에 의해 간단한 그룹으로 이루어집니다. 당신은 유가 증권에 의한 그룹에 원하는 매입 일의 최대를 얻을. 는 SQL :

    SELECT security, max(buy_date) 
    from positions
    group by security
    

    참고이 빠른 bluefeet의 대답보다하지만 ID를 표시하지 않습니다.

  4. ==============================

    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. ==============================

    5.

    select security, max(buy_date) group by security from positions;
    

    (당신이 쿼리에서 원하는 당신은 "각 x의"문구를 포함 큰 소리로 무엇을 말할 때, 당신은 아마 X에 의해 그룹을 원하는) 각 보안을 위해 최대 구매 날짜를 얻기 위해 필요한 모든 것입니다

    그룹을하여 사용하는 경우, 당신의 선택해야합니다 모든 열 중 하나를 예를 들어,이 ID를 포함하고 싶었다, 그래서 만약, 당신은 아마 당신이 한 것과 유사한 하위 쿼리를 사용해야 할 것 또는 집계에 의해 그룹화 된 열 수 전에, 당신에게 너무 많은 행을 줄 것이라고하여 합리적으로 ID를 사용할 수있는 모든 집계, 또 다른 그룹이 될 것 같지 않기 때문에.

  6. from https://stackoverflow.com/questions/15211479/groupwise-maximum by cc-by-sa and MIT license