【问题标题】:Window functions in SQLite3SQLite3 中的窗口函数
【发布时间】:2018-08-10 16:45:06
【问题描述】:

以下 Oracle SQL 选择允许我根据某些字段选择表中重复的所有行,例如,它们具有相同的 COLUMN_1COLUMN_2COLUMN_3

SELECT  *
FROM    (
        SELECT  t.*, ROW_NUMBER() OVER (PARTITION BY COLUMN_1, COLUMN_2, COLUMN_3 ORDER BY COLUMN_1) AS rn
        FROM    MY_TABLE t
        )
WHERE   rn > 1;

如何在 sqlite3 中做同样的事情?

【问题讨论】:

    标签: sql sqlite window-functions


    【解决方案1】:

    以下查询可以让你接近你想要的:

    SELECT t1.*
    FROM MY_TABLE t1
    LEFT JOIN
    (
        SELECT COLUMN_2, COLUMN_3, MIN(COLUMN_1) AS MIN_COLUMN_1
        FROM MY_TABLE
        GROUP BY COLUMN_2, COLUMN_3
    ) t2
        ON t1.COLUMN_2 = t2.COLUMN_2 AND
           t1.COLUMN_3 = t2.COLUMN_3 AND
           t1.COLUMN_1 = t2.MIN_COLUMN_1
    WHERE
        t2.COLUMN_2 IS NULL;
    

    此查询的工作原理是过滤掉每个 COLUMN_2COLUMN_3 组中具有最小 COLUMN_1 值的记录。实际上,这对应的是排名而不是行号,但也许这对你来说是可以接受的。

    【讨论】:

      【解决方案2】:

      您可以使用rowid 和相关子查询:

      select t.*
      from (select t.*,
                   (select count(*)
                    from my_table t2
                    where t2.column_1 = t.column_1 and t2.column_2 = t.column_2 and
                          t2.column_3 = t.column_3 and t2.rowid <= t.rowid
                   ) as seqnum
            from my_table t
           ) t
      where seqnum > 1;
      

      您可以使用任何唯一键代替rowid,如果您在表中有一个。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-07
        • 2022-01-19
        • 2023-04-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-30
        • 1970-01-01
        相关资源
        最近更新 更多