복붙노트

[SQL] 나는 각 사용자에 대한 최신 기록 날짜를 SQL 쿼리 어떻게

SQL

나는 각 사용자에 대한 최신 기록 날짜를 SQL 쿼리 어떻게

나는 사용자가 로그온 할 때까지로 수집 항목이있는 테이블이있다.

username, date,      value
--------------------------
brad,     1/2/2010,  1.1
fred,     1/3/2010,  1.0
bob,      8/4/2009,  1.5
brad,     2/2/2010,  1.2
fred,     12/2/2009, 1.3

etc..

어떻게 나에게 각 사용자에 대한 최신 날짜를 줄 것이다 쿼리를 만들려면 어떻게해야합니까?

업데이트 : 내가 가장 늦은 날짜와 함께 간다 값을 가질 필요가 있다고 잊어 버렸습니다.

해결법

  1. ==============================

    1.

    select t.username, t.date, t.value
    from MyTable t
    inner join (
        select username, max(date) as MaxDate
        from MyTable
        group by username
    ) tm on t.username = tm.username and t.date = tm.MaxDate
    
  2. ==============================

    2.사용 윈도우 함수 (오라클, 포스트 그레스 8.4 2005 SQL 서버, DB2, 사이베이스, 파이어 버드 3.0, MariaDB 10.3에서 작품)

    사용 윈도우 함수 (오라클, 포스트 그레스 8.4 2005 SQL 서버, DB2, 사이베이스, 파이어 버드 3.0, MariaDB 10.3에서 작품)

    select * from (
        select
            username,
            date,
            value,
            row_number() over(partition by username order by date desc) as rn
        from
            yourtable
    ) t
    where t.rn = 1
    
  3. ==============================

    3.나는 개발자의 대부분이 큰 데이터에 미치는 영향을 고려하지 않고 인라인 쿼리 사용을 참조하십시오.

    나는 개발자의 대부분이 큰 데이터에 미치는 영향을 고려하지 않고 인라인 쿼리 사용을 참조하십시오.

    간단하게, 당신은이에 의해 얻을 수 있습니다 :

    SELECT a.username, a.date, a.value
    FROM myTable a
    LEFT OUTER JOIN myTable b
    ON a.username = b.username 
    AND a.date < b.date
    WHERE b.username IS NULL
    ORDER BY a.date desc;
    
  4. ==============================

    4.사용자의 최대 날짜를 포함하는 전체 행을 얻으려면 :

    사용자의 최대 날짜를 포함하는 전체 행을 얻으려면 :

    select username, date, value
    from tablename where (username, date) in (
        select username, max(date) as date
        from tablename
        group by username
    )
    
  5. ==============================

    5.

    SELECT *     
    FROM MyTable T1    
    WHERE date = (
       SELECT max(date)
       FROM MyTable T2
       WHERE T1.username=T2.username
    )
    
  6. ==============================

    6.내 경험에서 가장 빠른 방법은 테이블에 새로운 행이없는 각 행을하는 것입니다.

    내 경험에서 가장 빠른 방법은 테이블에 새로운 행이없는 각 행을하는 것입니다.

    또 다른 장점은 사용되는 구문은 매우 간단하고, 쿼리의 의미 파악에 오히려 쉽다는 것을 (더 새로운 행이 사용자 이름이 고려되고 존재하지 않도록 모든 행을)이다.

    SELECT username, value
    FROM t
    WHERE NOT EXISTS (
      SELECT *
      FROM t AS witness
      WHERE witness.username = t.username AND witness.date > t.date
    );
    
    SELECT username, value
    FROM (
      SELECT username, value, row_number() OVER (PARTITION BY username ORDER BY date DESC) AS rn
      FROM t
    ) t2
    WHERE rn = 1
    
    SELECT t.username, t.value
    FROM t
    INNER JOIN (
      SELECT username, MAX(date) AS date
      FROM t
      GROUP BY username
    ) tm ON t.username = tm.username AND t.date = tm.date;
    
    SELECT username, value
    FROM t
    LEFT OUTER JOIN t AS w ON t.username = w.username AND t.date < w.date
    WHERE w.username IS NULL
    
  7. ==============================

    7.이 사람은 당신에게 당신의 편집 질문에 대한 정확한 결과를 제공해야합니다.

    이 사람은 당신에게 당신의 편집 질문에 대한 정확한 결과를 제공해야합니다.

    하위 쿼리는 최근 날짜의 행을 찾을 수있을 거라 확신하게하고, 외부 GROUP BY는 관계 처리됩니다. 동일한 사용자에 대해 동일한 날짜에 대한 두 개의 항목이있는 경우, 가장 높은 값을 가진 하나를 반환합니다.

    SELECT t.username, t.date, MAX( t.value ) value
    FROM your_table t
    JOIN (
           SELECT username, MAX( date ) date
           FROM your_table
           GROUP BY username
    ) x ON ( x.username = t.username AND x.date = t.date )
    GROUP BY t.username, t.date
    
  8. ==============================

    8.또한 분석 순위 기능을 사용할 수 있습니다

    또한 분석 순위 기능을 사용할 수 있습니다

        with temp as 
    (
    select username, date, RANK() over (partition by username order by date desc) as rnk from t
    )
    select username, rnk from t where rnk = 1
    
  9. ==============================

    9.

    SELECT Username, date, value
     from MyTable mt
     inner join (select username, max(date) date
                  from MyTable
                  group by username) sub
      on sub.username = mt.username
       and sub.date = mt.date
    

    업데이트 된 문제를 해결합니다. 심지어 좋은 인덱싱, 큰 테이블에 너무 잘 작동하지 않을 수 있습니다.

  10. ==============================

    10.

    SELECT *
    FROM ReportStatus c
    inner join ( SELECT 
      MAX(Date) AS MaxDate
      FROM ReportStatus ) m
    on  c.date = m.maxdate
    
  11. ==============================

    11.오라클은 내림차순으로 결과 집합을 정렬하고 첫 번째 레코드 소요를 들어, 그래서 당신은 최신 기록을 얻을 것이다 :

    오라클은 내림차순으로 결과 집합을 정렬하고 첫 번째 레코드 소요를 들어, 그래서 당신은 최신 기록을 얻을 것이다 :

    select * from mytable
    where rownum = 1
    order by date desc
    
  12. ==============================

    12.

    SELECT DISTINCT Username, Dates,value 
    FROM TableName
    WHERE  Dates IN (SELECT  MAX(Dates) FROM TableName GROUP BY Username)
    
    
    Username    Dates       value
    bob         2010-02-02  1.2       
    brad        2010-01-02  1.1       
    fred        2010-01-03  1.0       
    
  13. ==============================

    13.

    SELECT t1.username, t1.date, value
    FROM MyTable as t1
    INNER JOIN (SELECT username, MAX(date)
                FROM MyTable
                GROUP BY username) as t2 ON  t2.username = t1.username AND t2.date = t1.date
    
  14. ==============================

    14.표에서 선택 * 어디 lastest_date = (선택 최대 (LATEST_DATE) 표에서 위치를 사용자 = username이)

    표에서 선택 * 어디 lastest_date = (선택 최대 (LATEST_DATE) 표에서 위치를 사용자 = username이)

    내부 쿼리는 외부 쿼리 내부 쿼리 결과에 따라 모든 데이터를 끌어, 현재 사용자의 최신 날짜를 반환합니다.

  15. ==============================

    15.나는 내 테이블에 가지고 각 사용자에 대한 마지막 기록을 위해이 방법을 사용했다. PDA 장치에서 감지 최근 시간에 따라 영업 사원에 대한 마지막 위치를 얻을 수있는 질문이었다.

    나는 내 테이블에 가지고 각 사용자에 대한 마지막 기록을 위해이 방법을 사용했다. PDA 장치에서 감지 최근 시간에 따라 영업 사원에 대한 마지막 위치를 얻을 수있는 질문이었다.

    CREATE FUNCTION dbo.UsersLocation()
    RETURNS TABLE
    AS
    RETURN
    Select GS.UserID, MAX(GS.UTCDateTime) 'LastDate'
    From USERGPS GS
    where year(GS.UTCDateTime) = YEAR(GETDATE()) 
    Group By GS.UserID
    GO
    select  gs.UserID, sl.LastDate, gs.Latitude , gs.Longitude
            from USERGPS gs
            inner join USER s on gs.SalesManNo = s.SalesmanNo 
            inner join dbo.UsersLocation() sl on gs.UserID= sl.UserID and gs.UTCDateTime = sl.LastDate 
            order by LastDate desc
    
  16. ==============================

    16.

    SELECT * FROM TABEL1 WHERE DATE= (SELECT MAX(CREATED_DATE) FROM TABEL1)
    
  17. ==============================

    17.내 작은 컴파일

    내 작은 컴파일

    그래서, 여기에 쿼리는 다음과 같습니다

    select
     t.*
    from 
     Table t inner join (
      select distinct first_value(ID) over(partition by GroupColumn order by DateColumn desc) as ID
      from Table
      where FilterColumn = 'value'
     ) j on t.ID = j.ID
    

    장점 :

    단점 :

  18. ==============================

    18.나는 그것으로 내 응용 프로그램에 대한 다소했다 :

    나는 그것으로 내 응용 프로그램에 대한 다소했다 :

    다음 쿼리는 다음과 같습니다

    select distinct i.userId,i.statusCheck, l.userName from internetstatus 
    as i inner join login as l on i.userID=l.userID 
    where nowtime in((select max(nowtime) from InternetStatus group by userID));    
    
  19. ==============================

    19.이것은 위의 답변 중 하나와 비슷하지만, 내 생각에 그것은 훨씬 더 간단하고 정돈합니다. 또한, 십자가에 대한 쇼 좋은 사용은 문을 적용합니다. 위의 SQL Server 2005 및 위해 ...

    이것은 위의 답변 중 하나와 비슷하지만, 내 생각에 그것은 훨씬 더 간단하고 정돈합니다. 또한, 십자가에 대한 쇼 좋은 사용은 문을 적용합니다. 위의 SQL Server 2005 및 위해 ...

    select
        a.username,
        a.date,
        a.value,
    from yourtable a
    cross apply (select max(date) 'maxdate' from yourtable a1 where a.username=a1.username) b
    where a.date=b.maxdate
    
  20. ==============================

    20.이것은 또한 사용자에 대한 모든 최신 항목을 얻기 위해 작동합니다.

    이것은 또한 사용자에 대한 모든 최신 항목을 얻기 위해 작동합니다.

    SELECT username, MAX(date) as Date, value
    FROM MyTable
    GROUP BY username, value
    
  21. ==============================

    21.당신은 집계 함수 MAX와 GROUP BY를 사용합니다

    당신은 집계 함수 MAX와 GROUP BY를 사용합니다

    SELECT username, MAX(date), value FROM tablename GROUP BY username, value
    
  22. from https://stackoverflow.com/questions/2411559/how-do-i-query-sql-for-a-latest-record-date-for-each-user by cc-by-sa and MIT license