首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQLite:每个字段只保留n行

SQLite:每个字段只保留n行
EN

Database Administration用户
提问于 2019-07-04 12:17:00
回答 3查看 544关注 0票数 0

我有张桌子

代码语言:javascript
复制
+-----------------------------+---------------+-----------+
|         Painter             | Painting      | Rate      |
+-----------------------------+---------------+-----------+
|  Zinaida Serebriakova       | Window        | 5         |
|  Zinaida Serebriakova       | Florence      | 1         |
|  Zinaida Serebriakova       | Nude          | 8         |
|  Zinaida Serebriakova       | Bath          | 4         |
|  Thomas And William Daniell | Turbine Makers| 2         |
|  Thomas And William Daniell | George Iain   | 7         |
|  Thomas And William Daniell | Flax Pullers  | 3         |
|  Robert Motherwell          | Galleons      | 1         |
|  Robert Motherwell          | Ulysses       | 2         |
+-----------------------------+---------------+-----------+

我需要为每一位画家拿两幅画,以最高的速度。

代码语言:javascript
复制
+-----------------------------+---------------+-----------+
|         Painter             | Painting      | Rate      |
+-----------------------------+---------------+-----------+
|  Zinaida Serebriakova       | Nude          | 8         |
|  Zinaida Serebriakova       | Window        | 5         |
|  Thomas And William Daniell | George Iain   | 7         |
|  Thomas And William Daniell | Flax Pullers  | 3         |
|  Robert Motherwell          | Ulysses       | 2         |
|  Robert Motherwell          | Galleons      | 1         |
+-----------------------------+---------------+-----------+

删除所有其他的东西!

EN

回答 3

Database Administration用户

发布于 2019-07-04 12:58:14

代码语言:javascript
复制
WITH 
cte AS ( SELECT author, 
                name, 
                rating, 
                ROW_NUMBER() OVER ( PARTITION BY author 
                                    ORDER BY rating DESC ) rn
         FROM ratings )
DELETE
FROM ratings
WHERE EXISTS ( SELECT 1
               FROM cte
               WHERE ratings.author = cte.author
                 AND ratings.name = cte.name
                 AND cte.rn > 2 );

小提琴

票数 1
EN

Database Administration用户

发布于 2019-07-05 13:32:25

另一个使用row_number()窗口函数的版本(因此需要sqlite3.25或更高版本):

代码语言:javascript
复制
DELETE FROM ratings
WHERE rowid IN (SELECT rowid
                FROM (SELECT rowid
                           , row_number() OVER (PARTITION BY painter ORDER BY rate DESC) AS rn
                      FROM ratings)
                WHERE rn > 2);
票数 1
EN

Database Administration用户

发布于 2019-07-04 12:45:34

使用python脚本。

代码语言:javascript
复制
connection = sqlite3.connect("YOUR_DB.db")
cursor = connection.cursor()

# Select painters with number of its occurance
sql = "SELECT DISTINCT Painter, COUNT(*) FROM Paintings GROUP BY PainterORDER BY COUNT(*) DESC"

# Get only artists with occurance greater than N
data = [artist[0] for artist in selected_data if artist[1] > 150]

while data:

    # One by one get artists and select N-th max rate
    artist = data.pop(0)
    sql = "SELECT Champ51 FROM Paintings WHERE Champ1 = ? ORDER BY Champ51 DESC LIMIT 1 OFFSET 149"
    selected_data = cursor.execute(sql, [artist]).fetchall()
    last = selected_data[0][0]

    # Delete rate less than N-th
    sql = "DELETE FROM Paintings WHERE Champ1 = ? AND Champ51 < ?"
    cursor.execute(sql, [artist, last])
    connection.commit()
票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/242080

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档