我有一个 Cassandra 表,其中每列可以包含一个值或 NULL。但如果它包含 NULL,我知道该列中的所有下一个值也都是 NULL。
类似这样的事情:
+------------+---------+---------+---------+
| date | column1 | column2 | column3 |
+------------+---------+---------+---------+
| 2017-01-01 | 1 | 'a' | NULL |
| 2017-01-02 | 2 | 'b' | NULL |
| 2017-01-03 | 3 | NULL | NULL |
| 2017-01-04 | 4 | NULL | NULL |
| 2017-01-05 | NULL | NULL | NULL |
+------------+---------+---------+---------+
我需要一个查询,对于给定的列,返回具有非空值的最后一列的日期。在这种情况下:
- 对于第 1 列,“2017-01-04”
- 对于第 2 列,“2017-01-02”
- 对于第3列,没有返回结果。
在 SQL 中,它会是这样的:
SELECT date
FROM my_table
WHERE column1 IS NOT NULL
ORDER BY date DESC LIMIT 1
是否有可能以任何方式,或者我应该将表分成每列一个表以避免出现 NULL 情况?
最佳答案
tldr;创建一个新表来单独跟踪这一点。
只有当“列 1”是主键的一部分、具有二级索引或具有物化 View 时,这才可能实现。
您不希望主键为空。顺便说一句,请确保您将“UNSET”写入表的其余部分以代替 null。这应该由驱动程序处理,但有些驱动程序还不是很成熟。写入 null 实际上是一个删除操作,并且会导致逻辑删除。
辅助索引会带来性能问题,因为它们可能会影响整个集群,并且在超出某个点后无法很好地扩展。
物化 View 已被弃用,因此可能会避免使用这些 View 。
创建一个单独的表来跟踪这个确切的功能可能会为您提供更好的服务。这意味着多次写入和多次读取,但会避免大型表扫描和二级索引。
我假设您的分区不是按日期排列的,并且您有宽行,因为它使这变得更简单,但这就是它的样子。
CREATE TABLE my_table (
partition bigint,
date text,
column1 bigint,
column2 text,
column3 text,
PRIMARY KEY(partition, date);
CREATE TABLE offset_tracker(
partition bigint,
date text,
PRIMARY KEY(partition);
在这里,您可以执行select date FROM offset_tracker WHERE partition=x
来获取“具有值的最大日期”。
关于Cassandra:在列中获取最后一个非空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47538799/