当前位置: 首页 > 面试题库 >

查找多个列的第一个非空值

马弘和
2023-03-14
问题内容

我试图获取许多列中的第一个非空值。我知道我可以使用每列的子查询来完成此操作。以性能的名义(在这种情况下确实很重要),我想一次完成。

以以下示例数据为例:

col1     col2     col3     sortCol
====================================
NULL     4        8        1
1        NULL     0        2
5        7        NULL     3

我的梦想查询将在每个数据列中找到第一个非null值,并按排序sortCol

例如,选择第一三列的神奇骨料时,排序由所述sortCol下降。

col1     col2     col3
========================
5        7         0

或升序排序时:

col1     col2     col3
========================
1        4         8

有人知道解决方案吗?


问题答案:

first_value(col)可以与一起使用and OVER (ORDER BY CASE WHEN col IS NOT NULL THEN sortcol ELSE maxvalue END)ELSE maxvalue是必需的,因为SQL Server首先对null进行排序)

CREATE TABLE foo(a int, b int, c int, sortCol int);
INSERT INTO foo VALUES
    (null, 4, 8, 1),
    (1, null, 0, 2),
    (5, 7, null, 3);

现在,您可以看到我们必须执行什么操作来强制null在sortcol。之后排序。为此,desc您必须确保它们具有负值。

SELECT TOP(1)
     first_value(a) OVER (ORDER BY CASE WHEN a IS NOT NULL THEN sortcol ELSE 2^31-1 END) AS a,
     first_value(b) OVER (ORDER BY CASE WHEN b IS NOT NULL THEN sortcol ELSE 2^31-1 END) AS b,
     first_value(c) OVER (ORDER BY CASE WHEN c IS NOT NULL THEN sortcol ELSE 2^31-1 END) AS c
FROM foo;

PostgreSQL的

PostgreSQL稍微简单一些,

CREATE TABLE foo(a,b,c,sortCol)
AS VALUES
  (null, 4, 8, 1),
  (1, null, 0, 2),
  (5, 7, null, 3);

SELECT
     first_value(a) OVER (ORDER BY CASE WHEN a IS NOT NULL THEN sortcol END) AS a,
     first_value(b) OVER (ORDER BY CASE WHEN b IS NOT NULL THEN sortcol END) AS b,
     first_value(c) OVER (ORDER BY CASE WHEN c IS NOT NULL THEN sortcol END) AS c
FROM foo
FETCH FIRST ROW ONLY;

我相信,当RDBMS开始采用时,所有这些都将消失IGNORE NULLS。那只会是first_value(a IGNORE NULLS)



 类似资料:
  • 问题内容: 如果我在Pandas中有一个DataFrame,看起来像这样: 如何从每一行中获取第一个非空值?例如,上面我想得到:(或等效的Series)。 问题答案: 这是一种非常麻烦的方法,首先用于获取有效列,将返回的序列转换为数据框,以便我们可以逐行调用并将其索引回原始df: 编辑 稍微干净一点的方法:

  • 本文向大家介绍Python列表中的第一个非空字符串,包括了Python列表中的第一个非空字符串的使用技巧和注意事项,需要的朋友参考一下 给定一个字符串列表,让我们找出第一个非空元素。挑战在于–列表开头可能有一个,两个或多个空字符串,我们必须动态地找出第一个非空字符串。 下一个 如果当前元素为null,则应用next函数继续移动到下一个元素。 示例 输出结果 运行上面的代码给我们以下结果- 与文件管

  • 问题内容: 我有一个示例数据框显示如下。对于每一行,我想先检查c1,如果它不为null,则检查c2。通过这种方式,找到第一个非空列并将该值存储到列结果中。 我现在正在使用这种方式。但是我想知道是否有更好的方法。(列名没有任何模式,这只是示例) 当有很多列时,此方法看起来不好。 问题答案: 首先使用回填s,然后通过以下方式选择第一列: 要么: 性能 :

  • 问题内容: 假设我有以下形式的numpy数组: 我想找到第一个索引(对于每一列)的索引,其中值非零。 因此,在这种情况下,我希望返回以下内容: 我该怎么办? 问题答案: 首次出现的指标 使用沿轴(零轴这里列)非零的面具拿到第一的指标(真实值) 扩展到涵盖通用轴说明符,并且在沿着该轴找不到元素的非零的情况下,我们将有一个类似的实现- 请注意,由于所有值都会返回,因此如果需要的话,我们将直接使用生成最

  • 我收集了< code > 我想找到“每种类型中的一种”,尽管我想找到产品集合中每个谓词的第一个匹配项。 目前我的代码如下: 但这当然会多次迭代产品集合,这是不需要的,因为在我的例子中,我有100000个产品和64个谓词,并且需要很长时间。 在我的特例中,谓词是互斥的:如果一个谓词返回true,那么对于该特定产品,所有其他谓词都可以跳过。因为我使用了< code>findFirst,所以对于所有其他

  • 允许查找两个共同祖先的提交位置。是否有一种方法可以找到再次合并两个分支的commit?