![](/img/trans.png)
[英]Postgresql: how statistics are collected in the histogram_bounds
[英]postgresql query equivalent of date histogram with extended bounds in elastic search
我有一个包含以下列的表格:
第 1 列 | 第 2 列 | 时间戳 | event_id |
---|---|---|---|
c1v1 | c2v1 | 2021-03-11 00:00:00 | 1 |
c1v2 | c2v2 | 2021-03-11 01:03:00 | 1 |
c1v3 | c2v3 | 2021-03-12 10:00:00 | 2 |
c1v4 | c2v4 | 2021-03-13 20:00:00 | 1 |
c1v5 | c2v5 | 2021-03-13 11:00:00 | 2 |
c1v6 | c2v6 | 2021-03-13 00:00:00 | 3 |
c1v7 | c2v7 | 2021-03-14 00:00:00 | 2 |
我有start_time = 2021-03-10 05:14:00
和end_time = 2021-03-15 15:12:19
我正在对这些数据进行弹性搜索查询
{
"query": {
"bool": {
"filter":
[
{
"term": {"column1": "some_value"}
},
{
"term": {"column2": "some_value"}
},
{
"range": {
"timestamp": {
"gte": "<start_time>",
"lt": "<end_time>"
}
}
}
]
}
},
"aggs": {
"timestamp": {
"date_histogram": {
"field": "timestamp",
"fixed_interval": "1d",
"extended_bounds": {
"min": "<start_time>",
"max": "<end_time>"
}
},
"aggs": {
"unique_values": {
"cardinality": {
"field": "event_id"
}
}
}
}
}
}
我需要帮助来创建一个相同的 sql 查询。
Output:
时间戳 | doc_count | 唯一值 |
---|---|---|
2021-03-10 | 0 | 0 |
2021-03-11 | 2 | 1 |
2021-03-12 | 1 | 1 |
2021-03-13 | 3 | 3 |
2021-03-14 | 1 | 1 |
2021-03-15 | 0 | 0 |
更新:我提出了这个查询,但我得到的值接近 es 中的值,但不准确。 这也不会返回包含 0 个文档的日期。
SELECT
date_floor,
count(date_floor) AS cnt_date_floor,
count(DISTINCT(event_id)) AS cnt_dst_event_id
FROM (
SELECT
event_id,
DATE(timestamp) AS date_floor
FROM
<table_name>
WHERE
date BETWEEN date'<start_date>' AND date'<end_date>' AND
timestamp >= timestamp'<start_time>' AND
timestamp < timestamp'<end_time>' AND
column1 IN ('some val') AND
column2 = some_val)
GROUP BY date_floor
其中 start_date 和 end_date 是 start_time 和 end_time 的 floor_dates
您可以使用 generate_series 来生成您需要的日期。 离开加入这个系列并按天分组。
SELECT day,
count(event_id) as doc_count,
count(distinct event_id) as unique_values
FROM generate_series('2021-03-10T00:00:00', '2021-03-15T00:00:00', interval '1 day') as g(day)
LEFT JOIN test ON date_trunc('day', tstamp) = day
GROUP BY day
ORDER BY day;
您的查询对 column1 和 column2 进行了一些额外的过滤,这些过滤不是问题的一部分,但是将它们重新添加进来应该很简单。
如果您没有在查询之外将开始时间设置为一天开始的奢侈,只需添加 date_trunc('day', <start_time>) 而不是开始时间。
这是一个小提琴。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.