복붙노트

[SQL] 로 ... 파티션 (이상 ROW_NUMBER ()의 sqlite가 동등한?

SQL

로 ... 파티션 (이상 ROW_NUMBER ()의 sqlite가 동등한?

나는 그것이 하나의 sqlite가 문을 사용하여 다음을 수행 할 수 있는지 알고 싶습니다 :

내 표는 다음과 같은 :

|AnId|UserId|SomeDate|SomeData|
|123 |A     |1/1/2010|aadsljvs|
| 87 |A     |2/9/2010|asda fas|
|193 |A     |2/4/2010|aadsljvs|
|927 |A     |7/3/2010|aadsasdf|
|816 |B     |1/1/2010|aa32973v|
|109 |B     |7/5/2010|aaasfd10|
| 39 |B     |1/3/2010|66699327|
...

각 행은 고유 ID, 사용자 ID, 시간 값 및 다른 데이터를 갖는다.

내가 SomeDate를 기반으로, 사용자 당 최신 (10 개) 기록을 유지, 그래서 나는 레코드를 삭제하고 싶습니다.

SQL Server의 I는 다음과 같이 사용하십시오 :

delete d
from data d
inner join (
    select UserId
        ,  AnId
        ,  row_number() over ( partition by UserId order by SomeDate desc ) 
              as RowNum
    from data 
) ranked on d.AnId = ranked.AnId
where ranked.RowNum > 10

sqlite가이 할 수있는 방법이 있나요? 에지 경우 동일한 SomeDate 여러 레코드가 특정 걱정이되지 않는 곳에, 예를 들어 나는 모든 기록을 보관하는 경우 그 잘 될 것입니다.

해결법

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

    1.이 질문은 오래 알고 있지만, 다음과 같은 SQLite는 문 로리는 원래 하나 개의 문장에 요구했다 무엇을 할 것인가 - 사용자 아이디가 (SomeDate 기준) 것을위한 10 개 가장 최근 기록하지 않은 주어진 사용자 아이디에 대한 모든 기록을 삭제합니다.

    이 질문은 오래 알고 있지만, 다음과 같은 SQLite는 문 로리는 원래 하나 개의 문장에 요구했다 무엇을 할 것인가 - 사용자 아이디가 (SomeDate 기준) 것을위한 10 개 가장 최근 기록하지 않은 주어진 사용자 아이디에 대한 모든 기록을 삭제합니다.

    DELETE FROM data
    WHERE AnId IN (SELECT AnId
                   FROM data AS d
                   WHERE d.UserId = data.UserId
                   ORDER BY SomeDate DESC
                   LIMIT -1 OFFSET 10)
    
  2. ==============================

    2.I는 "개체"테이블 많은 관계로 1 표의 각각의 "객체"에 대한 제 2 열을 인출 할 필요가 있었다.

    I는 "개체"테이블 많은 관계로 1 표의 각각의 "객체"에 대한 제 2 열을 인출 할 필요가 있었다.

    일반적으로 SQL이는 (primary_id DESC에 의해 OBJECT_ID 주문 파티션) ROW_NUMBER () OVER를 사용하여 수행됩니다

    에서 SQLite는 나도 같은 결과를 얻을이 부두 하위 쿼리를 마련했다

    SELECT object_id, MAX(_id)
    FROM (SELECT object_id, _id
    FROM aTable
    EXCEPT
    SELECT object_id, MAX(_id)
    FROM aTable
    GROUP BY object_id)
    GROUP BY object_id;
    

    주 : 테이블 _id 대상물 테이블의 기본 키는 조회 테이블 1에 관계가 많은

  3. ==============================

    3.이 이것에 대해 터무니없이 비싼 (? 사용자가 새 레코드를 삽입 할 때 아마도 단지 그것을 할)하지만 어떻게 수 있습니다 :

    이 이것에 대해 터무니없이 비싼 (? 사용자가 새 레코드를 삽입 할 때 아마도 단지 그것을 할)하지만 어떻게 수 있습니다 :

    for user in users:
      user-records = select * from records where user=user
      if user-records.length > 10:
        delete from records where user=user and date<user-records[10]
    

    (SQL 및 의사의 믹스)

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

    4.당신은 이미 답을 가지고하지 않은 경우. 그것은 하나 개의 테이블의 경우에, 당신은 어떤 조인이 필요하지 않습니다. 당신은 사용할 수 있습니다 :

    당신은 이미 답을 가지고하지 않은 경우. 그것은 하나 개의 테이블의 경우에, 당신은 어떤 조인이 필요하지 않습니다. 당신은 사용할 수 있습니다 :

    Delete From data
    where AnId not in (Select AnId
                       from data
                       Order by SomeDate DESC
                       Limit 10)
    
  5. ==============================

    5.SQLite는 현재 3.25 윈도우 기능이 지원됩니다. 자세한 내용은 https://www.sqlite.org/windowfunctions.html를 참조하십시오.

    SQLite는 현재 3.25 윈도우 기능이 지원됩니다. 자세한 내용은 https://www.sqlite.org/windowfunctions.html를 참조하십시오.

  6. from https://stackoverflow.com/questions/4074257/sqlite-equivalent-of-row-number-over-partition-by by cc-by-sa and MIT license