SQL查询语句应该避免的五个错误( 二 )

  • ROW_NUMBER WF可以列举行 (row)。 还可以用它来删除重复的记录 , 或者随机抽取样本 。
  • 顾名思义 , WF还可以在窗口里计算统计数据:
    上述的WF , 可以计算第一条记录到当前记录的累计总和 。 那在这一过程中 , 我在哪里出错了?
    我没有花时间去了解Window Functions的基础知识和功能教程 。 所以 , 我的查询过程变得过于复杂 , 还出现了bug 。
    运行以上查询:
    SQL查询语句应该避免的五个错误
    本文插图
    在SQL Fiddle中运行的示例
    如果你想在本地数据库中跟着练习 , 可以尝试这个代码 (与PostgreSQL 9.3一起使用):
    SQL查询语句应该避免的五个错误
    本文插图
    03
    用CASE WHEN计算平均值
    CASE WHEN就像是编程语言中的IF语句 。 当我们需要计算某个数据子集的统计数据时 , 它会很有用 。
    上图中 , 我计算了美国销售产品的平均价格 。 在CASE WHEN中 , 我使用ELSE的时候没有特别注意 。
    在第一个例子中 , 我用0表示了所有的非美国产品价格 , 而这导致了总体平均价格降低 。 如果有很多非美国的产品 , 那么平均值可能接近于0 。
    SQL查询语句应该避免的五个错误
    本文插图
    在第二个例子中 , 我只计算了在美国销售的产品的平均价格 , 这也是我们想要的结果 。
    请注意 , 使用CASE WHEN时 , 不是必须包括ELSE的 , 它的默认值是NULL 。
    SQL查询语句应该避免的五个错误
    本文插图
    重点是 , 使用CASE WHEN时 , 应该小心使用“else 0” 。 虽然它对SUM没有任何影响 , 但对AVG影响很大 。
    04
    用Join连接缺少值的列
    SQL查询语句应该避免的五个错误
    本文插图
    在两个字符串字段上的简单inner join
    SQL中有4种不同的连接:内连接 (inner join)、外连接 (outer join)、左连接(left join)和右连接 (right join) 。 当我们直接使用JOIN时 , 默认是INNER连接 。
    之前 , 我花了时间去阅读一些JOIN相关的教程 。 但我还是犯了一个低级错误 。
    我写了一个与上面类似的Join查询 。 但是当我执行数据验证时 , 发现很多记录不见了 。 这只是一个简单的JOIN函数 , 为什么会出现这种情况呢?
    结果表明 , 表1和表2中都有许多带有NULL值的string_field列 。 我以为JOIN会保留NULL值的记录 , 因为NULL值与NULL应该是一样的 , 不是吗?
    所以我做了以下尝试:
    返回结果为NULL 。
    如果想要返回所有条目 , 就需要处理COALESCE中所有的string_field , 它会把所有NULL转换为空字符串 。