在一行中查找第二、第三、第四、第五个非空值(sql)

lf3rwulv  于 2021-06-26  发布在  Impala
关注(0)|答案(1)|浏览(235)
ID |val1 | val2 | val3 | val4| val5| val6

1   NULL   NULL     a     b    NULL  NULL

2   NULL   NULL   NULL    b     c    d

对于这两个记录,我想提取第二个和第三个非空值。预期结果:

ID | 1st | 2nd | 3rd

1.    a    b    NULL

2.    b   c     d

让我重新表述一下这个问题,因为这是我正在处理的数据的原始格式。我想找到第n个非空值会更容易有3个商店。每家商店最多销售6种产品。每件产品可获得1星到6星的奖励。
车间id |产品id |评级
1 | a | 2个
1 | b | 6个
2 | a | 5个
2 | b | 6个
2 | c | 1个
2 | d | 2个
3 | a | 3个
我想根据评级对每种产品进行排名。预期结果是:
车间id |产品id |评级|等级
1 | a | 2 | 2
1 | b | 6 | 1
2 | a | 5 | 2个
2 | b | 6 | 1个
2 | c | 1 | 4个
2 | d | 2 | 3
3 | a | 3 | 1个
我希望这是清楚的。谢谢你的帮助!

7kqas0il

7kqas0il1#

扩展我的评论:
你的模式会更好 id | val_id | val 根据你的数据,你会发现:

+----+--------+------+
| id | val_id | val  |
+----+--------+------+
|  1 |      1 | NULL |
|  1 |      2 | NULL |
|  1 |      3 | a    |
|  1 |      4 | b    |
|  1 |      5 | NULL |
|  1 |      6 | NULL |
|  2 |      1 | NULL |
|  2 |      2 | NULL |
|  2 |      3 | NULL |
|  2 |      4 | b    |
|  2 |      5 | c    |
|  2 |      6 | d    |
+----+--------+------+

这样你就可以回答你的问题:

SELECT <TOP 5> * FROM yourtable ORDER BY id, val_id <LIMIT 5>

哪里 <TOP 5> 以及 <LIMIT 5> 是可互换的,这取决于您使用的rdbms。
要使数据看起来像这样更好的模式,可以使用联合查询:

SELECT id, 1, val1 FROM yourtable
UNION ALL 
SELECT id, 2, val2 FROM yourtable
UNION ALL
SELECT id, 3, val3 FROM yourtable
UNION ALL
SELECT id, 4, val4 FROM yourtable
UNION ALL
SELECT id, 5, val5 FROM yourtable
UNION ALL
SELECT id, 6, val6 FROM yourtable

您可以将其弹出到子查询中以代替 yourtable 在上面的sql中:

SELECT <TOP 5> * 
FROM
    (
        SELECT id, 1, val1 FROM yourtable
        UNION ALL 
        SELECT id, 2, val2 FROM yourtable
        UNION ALL
        SELECT id, 3, val3 FROM yourtable
        UNION ALL
        SELECT id, 4, val4 FROM yourtable
        UNION ALL
        SELECT id, 5, val5 FROM yourtable
        UNION ALL
        SELECT id, 6, val6 FROM yourtable
    ) yourtable 
 ORDER BY id, val_id <LIMIT 5>

相关问题