Как выбрать последнюю метку времени по отдельным столбцам? - PullRequest
1 голос
/ 11 февраля 2020

Предположим, есть таблица, подобная этой:

| user_id | location_id | datetime            | other_field |
| ------- | ----------- | ------------------- | ----------- |
| 12      | 1           | 2020-02-01 10:00:00 | asdqwe      |
| 12      | 1           | 2020-02-01 10:30:00 | asdqwe      |
| 12      | 2           | 2020-02-01 10:40:00 | asdqwe      |
| 12      | 2           | 2020-02-01 10:50:00 | asdqwe      |
| 13      | 1           | 2020-02-01 10:10:00 | asdqwe      |
| 13      | 1           | 2020-02-01 10:20:00 | asdqwe      |
| 14      | 3           | 2020-02-01 09:00:00 | asdqwe      |

Я хочу выбрать последние datetime каждого отдельного user_id и location_id. Вот какой результат я ищу:

| user_id | location_id | datetime            | other_field |
| ------- | ----------- | ------------------- | ----------- |
| 12      | 1           | 2020-02-01 10:30:00 | asdqwe      |
| 12      | 2           | 2020-02-01 10:50:00 | asdqwe      |
| 13      | 1           | 2020-02-01 10:20:00 | asdqwe      |
| 14      | 3           | 2020-02-01 09:00:00 | asdqwe      |

Вот описание таблицы:

CREATE TABLE mykeyspace.mytable (
    user_id int,
    location_id int,
    datetime timestamp,
    other_field text,
    PRIMARY KEY ((user_id, location_id, other_field), datetime)
) WITH CLUSTERING ORDER BY (datetime ASC)
    AND read_repair_chance = 0.0
    AND dclocal_read_repair_chance = 0.1
    AND gc_grace_seconds = 864000
    AND bloom_filter_fp_chance = 0.01
    AND caching = { 'keys' : 'ALL', 'rows_per_partition' : 'NONE' }
    AND comment = ''
    AND compaction = { 'class' : 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 'max_threshold' : 32, 'min_threshold' : 4 }
    AND compression = { 'chunk_length_in_kb' : 64, 'class' : 'org.apache.cassandra.io.compress.LZ4Compressor' }
    AND default_time_to_live = 0
    AND speculative_retry = '99PERCENTILE'
    AND min_index_interval = 128
    AND max_index_interval = 2048
    AND crc_check_chance = 1.0
    AND cdc = false;

1 Ответ

1 голос
/ 12 февраля 2020

Для таких вещей в CQL есть условие "PER PARTITION LIMIT" (доступно в Cassandra 3.6+ IIR C). Но для использования в вашей таблице вам нужно изменить определение таблицы на CLUSTERING ORDER BY (datetime DESC), и тогда вы можете написать:

select * from prospacedb.quarter_utilisation per partition limit 1;

и получить строку с последней отметкой времени для каждого ключа раздела, который у вас есть.

...