【发布时间】:2022-01-19 01:09:35
【问题描述】:
我有一个表crashes 大约有一百万行,每行包含以下任一数据:
-
并非发生在学校附近的每起车祸,或
-
在一所学校附近发生的每起车祸,如果发生在不止一所学校附近,则每次车祸会增加行数(例如,在 4 所学校附近发生的车祸会增加 4 行)。一次撞车事故的最高行数/附近学校数为 10。
我想在表中添加一列,对于出现在多行中的每个 crash_id 仅出现一次返回“1”,对于列中相同 crash_id 的任何后续出现返回“0” crash_id。哪一行的每个 crash_id 有 1 或 0 无关紧要。
我已经尝试了所有回复 this similar question 的建议,但我无法让其中任何一个为我工作。
FWIW,我用这个公式让它在 Excel 中工作:
=(COUNTIF($C$2:$C2,$C2)=1)+0
但那是一张小桌子,而不是一百万行的桌子。
到目前为止我已经尝试过:
SELECT *
FROM
(
SELECT * , ROW_NUMBER() OVER(PARTITION BY crash_id) AS row
FROM crashes
) AS A1
WHERE row <6
SELECT *
FROM
(
SELECT * , ROW_NUMBER() OVER(PARTITION BY crash_id) AS row
FROM crashes
) AS A1
WHERE row = 1
我知道这不是最佳的数据库设计,但它可以让我获得我需要的大部分内容,除了我上面描述的内容。
【问题讨论】:
-
minimal reproducible example 在询问 SQL 问题时是一个很好的开始。另请注意,与家庭作业相关的问题需要付出额外的努力。
-
"...对于每个唯一 crash_id 的第一次出现..." -- 你如何定义 10 行中的哪一行是第一个?请记住,在关系数据库中,行没有插入顺序。
-
首先,这是一个糟糕的数据库设计。应该有一个
crash表和一个以crash_id作为外键的crash-at-school表。crash表中crash_id值的重复是代码异味。crash表的唯一键是什么?如果没有,您将如何识别要更新的行? -
jarlh 这不是家庭作业。如果您要查看到目前为止我尝试过的内容:' SELECT * FROM ( SELECT * , ROW_NUMBER() OVER(PARTITION BY crash_id) AS row from crash ) AS A1 WHERE row
-
TheImpaler 就我而言,哪个被识别为第一个并不重要。我只想要一个允许我过滤表的列,这样每次崩溃我只能看到一行(即 WHERE id_unique = '1')。
标签: sql postgresql