首页 > 解决方案 > SQL 错误:ROW_NUMBER() OVER (PARTITION

问题描述

我的 SQL 代码有什么问题?

我试图在这个答案之后消除重复的行

但我不断收到以下错误:

“(”附近:语法错误:SELECT rn = ROW_NUMBER() OVER (

这是SQL代码:

SELECT 
    rn = ROW_NUMBER() OVER (PARTITION BY s.stop_id, s.stop_name 
                            ORDER BY s.stop_id, s.stop_name)
FROM stops s

我在某处读到它与 SQL 版本或 sqlite3 的使用有关?

这里有一些关于问题的附加信息:

我有起始表:

table_beginning =
[some_text0 , some_text1 , some_text2 ,  some_text3   ]
[ bla_1     ,   monday   ,    red     , bla_something ]
[ bla_77    ,   tuesday  ,   green    , bla_other     ]
[ bla_99    ,   monday   ,    blue    , bla_anything  ]
[ bla_00    ,  wednesday ,    red     , bla_maybe     ]
[ bla_55    ,   monday   ,   violet   , bla_more      ]
[ bal_66    ,   monday   ,    red     , bla_kind      ]
[ bal_22    ,   monday   ,    red     , bla_stuff     ]

我想最终得到一个没有关于 col_2 和 col_3 重复的表(不关心 col_1 和 col_4 是什么!!)

如:

table_final1 =
[some_text0 , some_text1 , some_text2 ,  some_text3   ]
[ bla_1     ,   monday   ,    red     , bla_something ]
[ bla_77    ,   tuesday  ,   green    , bla_other     ]
[ bla_99    ,   monday   ,    blue    , bla_anything  ]
[ bla_00    ,  wednesday ,    red     , bla_maybe     ]
[ bla_55    ,   monday   ,   violet   , bla_more      ]

(--> 哪些行被踢出无关紧要。因此,接受的决赛桌也可能如下所示:

table_final2 =
[some_text0 , some_text1 , some_text2 ,  some_text3   ]
[ bla_77    ,   tuesday  ,   green    , bla_other     ]
[ bla_99    ,   monday   ,    blue    , bla_anything  ]
[ bla_00    ,  wednesday ,    red     , bla_maybe     ]
[ bla_55    ,   monday   ,   violet   , bla_more      ]
[ bal_66    ,   monday   ,    red     , bla_kind      ]

或者

table_final3 =
[some_text0 , some_text1 , some_text2 ,  some_text3   ]
[ bla_77    ,   tuesday  ,   green    , bla_other     ]
[ bla_99    ,   monday   ,    blue    , bla_anything  ]
[ bla_00    ,  wednesday ,    red     , bla_maybe     ]
[ bla_55    ,   monday   ,   violet   , bla_more      ]
[ bal_22    ,   monday   ,    red     , bla_stuff     ]

重要的是 col_2 和 col_3 从来没有相同的两个条目!

如您所见some_text1 = monday AND some_text2 = red,现在只存在一次!(从仅查看 col_2 和 col_3 的角度消除重复)

至于 col_1 和 col_4 中的内容 - 我根本不在乎里面有什么!我只关心 col_2 和 col_3 里面的东西(那里没有任何重复!)

一种解决方案:

我想出了一种方法(但也许有更优雅的方法??)

CREATE TABLE table_intermediate AS
  SELECT DISTINCT col_2, col_3
FROM table_beginning;

--> 这将创建一个中间表 --> 使用DISTINCT关键字 this 确实消除了重复 --> (缺点,我完全丢失了 col_1 和 col_4 信息)

也许有一个解决方案可以让我保留有关 col_1 和 col_4 的信息???(同样,我不在乎 col_1 或 col_4 中的哪一个!)

标签: sqlsqliterow-number

解决方案


在 SQLite 中,您通常可以使用rowid

select s.*
from stops s
where s.rowid = (select min(s2.rowid)
                 from stops s2
                 where s2.stop_id = s.stop_id and s2.stop_name = s.stop_name
                );

我不确定这是否是您真正需要的。但这似乎是你想要做的row_number()。如果这没有达到目的,那么就用样本数据和期望的结果提出另一个问题。


推荐阅读