[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.이 질문은 오래 알고 있지만, 다음과 같은 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.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.이 이것에 대해 터무니없이 비싼 (? 사용자가 새 레코드를 삽입 할 때 아마도 단지 그것을 할)하지만 어떻게 수 있습니다 :
이 이것에 대해 터무니없이 비싼 (? 사용자가 새 레코드를 삽입 할 때 아마도 단지 그것을 할)하지만 어떻게 수 있습니다 :
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.당신은 이미 답을 가지고하지 않은 경우. 그것은 하나 개의 테이블의 경우에, 당신은 어떤 조인이 필요하지 않습니다. 당신은 사용할 수 있습니다 :
당신은 이미 답을 가지고하지 않은 경우. 그것은 하나 개의 테이블의 경우에, 당신은 어떤 조인이 필요하지 않습니다. 당신은 사용할 수 있습니다 :
Delete From data where AnId not in (Select AnId from data Order by SomeDate DESC Limit 10)
-
==============================
5.SQLite는 현재 3.25 윈도우 기능이 지원됩니다. 자세한 내용은 https://www.sqlite.org/windowfunctions.html를 참조하십시오.
SQLite는 현재 3.25 윈도우 기능이 지원됩니다. 자세한 내용은 https://www.sqlite.org/windowfunctions.html를 참조하십시오.
from https://stackoverflow.com/questions/4074257/sqlite-equivalent-of-row-number-over-partition-by by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 오라클은 SQL * 플러스에서 CREATE TABLE 문을 얻는 방법 (0) | 2020.05.13 |
---|---|
[SQL] 왜 그렇게 높은 윈도우 집계 함수에 대한 읽고 논리적인가? (0) | 2020.05.13 |
[SQL] 2005 SQL - 열은 여러 번 지정 (0) | 2020.05.13 |
[SQL] SQL Server의 IsInteger위한 최고의 상응 (0) | 2020.05.13 |
[SQL] 나는 IGNORE_DUP_KEY는 기본 키에 설정할 수 있습니까? (0) | 2020.05.13 |