postgresql某数据表中有多天的记录存在,我想取某天的第一条和最后一条记录,数据库查询语句怎么写

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了postgresql某数据表中有多天的记录存在,我想取某天的第一条和最后一条记录,数据库查询语句怎么写相关的知识,希望对你有一定的参考价值。

数据库的某天的数据类型是timestamp,最后取得的数据用于填水晶报表。

参考技术A select * from 表名
where 时间列名 in
(
select max(时间列名) from 表名 union all
select min(时间列名) from 表名
)追问

这个查出来的是该表中时间最大的和最小的。。。我想获得当前日期的最大记录和最小的。。。。比如今天7月1号,我的表中有6月27号、28号、29号、30号、1号的记录,我要获得1号(截止当前时间)的第一条记录和最后一条记录

追答

select * from 表名
where 时间列名 in
(
select max(时间列名) from 表名 where TO_CHAR(getdate(),'YYYYMMDD') = TO_CHAR(时间列名,'YYYYMMDD') union all
select min(时间列名) from 表名 where TO_CHAR(getdate(),'YYYYMMDD') = TO_CHAR(时间列名,'YYYYMMDD')
)

本回答被提问者采纳

Postgresql:如何用n步对组中的记录进行排序

【中文标题】Postgresql:如何用n步对组中的记录进行排序【英文标题】:Postgresql: how sort records in groups with n step 【发布时间】:2019-05-22 01:53:18 【问题描述】:

我的表中有按 rank 排序的行。所有 rank 值都不同。我还有 color 列,其中包含可能的值(红色、蓝色、绿色)。我需要遍历每一行(例如,将其命名为 X)并检查下一个 n 行中是否存在行(例如,将其命名为 Y)其中 X.color == Y.color 然后需要移动 Y 行并将其插入到 X 行之后。 例如 n = 5 和起始表:

id  rank    color
1   0.8     red                                               
3   0.76    blue                                              
4   0.75    blue                                              
7   0.743   green                                             
5   0.742   red                                               
6   0.741   green                                             
8   0.6     blue                                              
9   0.5     blue                                              
11  0.47    green                                             
12  0.45    blue                                              
10  0.4     red 

1 次迭代,我们在接下来的 n 行中有颜色为 red 的行,然后:

  id    rank    color
    1   0.8     red
    5   0.742   red                                                                                              
    3   0.76    blue                                              
    4   0.75    blue                                              
    7   0.743   green                                             
    6   0.741   green                                             
    8   0.6     blue                                              
    9   0.5     blue                                              
    11  0.47    green                                             
    12  0.45    blue                                              
    10  0.4     red

2 迭代,我们在接下来的 n 行中没有 red,然后没有变化

3 迭代,我们在接下来的 n 行中有 blue,但下一个蓝色行已经在当前行之后。

4 迭代,我们在接下来的 n 行中有 blue,然后:

  id    rank    color
    1   0.8     red
    5   0.742   red                                                                                              
    3   0.76    blue                                              
    4   0.75    blue
    8   0.6     blue                                                                                            
    7   0.743   green                                             
    6   0.741   green                                             
    9   0.5     blue                                              
    11  0.47    green                                             
    12  0.45    blue                                              
    10  0.4     red

5 次迭代,我们在接下来的 n 行中有 blue,然后:

  id    rank    color
    1   0.8     red
    5   0.742   red                                                                                              
    3   0.76    blue                                              
    4   0.75    blue
    8   0.6     blue
    9   0.5     blue                                                                                                                                          
    7   0.743   green                                             
    6   0.741   green                                             
    11  0.47    green                                             
    12  0.45    blue                                              
    10  0.4     red

6 迭代,我们在接下来的 n 行中有 blue,然后:

  id    rank    color
    1   0.8     red
    5   0.742   red                                                                                              
    3   0.76    blue                                              
    4   0.75    blue
    8   0.6     blue
    9   0.5     blue
    12  0.45    blue                                                                                                                                                                                        
    7   0.743   green                                             
    6   0.741   green                                             
    11  0.47    green                                             
    10  0.4     red

7 迭代,我们在接下来的 n 行中有 green,但下一个绿色行已经在当前行之后。

8 迭代,我们在接下来的 n 行中有 green,但下一个绿色行已经在当前行之后。

9 迭代,我们在接下来的 n 行中有 green,但下一个绿色行已经在当前行之后。

10 不进行任何更改。

有人有一个想法如何解决这个问题,我尝试固定窗口函数,但不清楚是否可以在它们的帮助下完成,也许需要一些其他机制?

【问题讨论】:

你说的是“接下来的 n 行”。隐含的排序是rank 的排序吗?当您谈论“移动一行”时,您是什么意思:更改其rank 或在(堆)表中物理移动它? @LaurenzAlbe 1) 最初按等级排序的记录,在迭代之后,它们没有完全按等级排序 - 如示例 2) “移动一行”意味着重新排序当前请求中的行 您肯定需要为此编写一个函数,因为在每次迭代之后,您都会拥有一个完全不同的数据集。一个简单的查询不能在一次调用中处理不同的数据集。另一种方法可能是尝试使用递归 CTE 的方法,但我不确定这是否可行。函数可能更快 【参考方案1】:

对于 SQL 相对较新的人来说,在遇到此类问题时考虑迭代是很常见的,但无需任何迭代也可以做到这一点。让我们分解一下。首先,让我们根据排名列找到所有数据的row_id:

with data as (select * from (values
(1,0.8 ,'red'),
(3,0.76 ,'blue'),
(4,0.75 ,'blue'),
(7,0.743 ,'green'),
(5,0.742 ,'red'),
(6,0.741 ,'green'),
(8,0.6 ,'blue'),
(9,0.5 ,'blue'),
(11,0.47 ,'green'),
(12,0.45 ,'blue'),
(10,0.4 ,'red')
) v(id, rank, color)
)
select id, rank, color,
  row_number() over (order by rank desc) as row_id
FROM data
ORDER BY rank desc;
 id | rank  | color | row_id
----+-------+-------+--------
  1 |   0.8 | red   |      1
  3 |  0.76 | blue  |      2
  4 |  0.75 | blue  |      3
  7 | 0.743 | green |      4
  5 | 0.742 | red   |      5
  6 | 0.741 | green |      6
  8 |   0.6 | blue  |      7
  9 |   0.5 | blue  |      8
 11 |  0.47 | green |      9
 12 |  0.45 | blue  |     10
 10 |   0.4 | red   |     11
(11 rows)

从那里,我们可以找出前五行中颜色相同的最小行:

with data as (select * from (values
(1,0.8 ,'red'),
(3,0.76 ,'blue'),
(4,0.75 ,'blue'),
(7,0.743 ,'green'),
(5,0.742 ,'red'),
(6,0.741 ,'green'),
(8,0.6 ,'blue'),
(9,0.5 ,'blue'),
(11,0.47 ,'green'),
(12,0.45 ,'blue'),
(10,0.4 ,'red')
) v(id, rank, color)
), all_rows as (
select id, rank, color,
  row_number() over (order by rank desc) as row_id
FROM data
ORDER BY rank desc
)
select id, rank, color, row_id,
  first_value(row_id) over (partition by color order by row_id range between 5 
  preceding and current row)
from all_rows
order by 5, rank desc;
 id | rank  | color | row_id | first_value
----+-------+-------+--------+-------------
  1 |   0.8 | red   |      1 |           1
  5 | 0.742 | red   |      5 |           1
  3 |  0.76 | blue  |      2 |           2
  4 |  0.75 | blue  |      3 |           2
  8 |   0.6 | blue  |      7 |           2
  9 |   0.5 | blue  |      8 |           3
  7 | 0.743 | green |      4 |           4
  6 | 0.741 | green |      6 |           4
 11 |  0.47 | green |      9 |           4
 12 |  0.45 | blue  |     10 |           7
 10 |   0.4 | red   |     11 |          11
(11 rows)

这很接近,但并不完全正确。我们需要从每种颜色的最后 5 行中获取最小值中的最小值。我们还需要一步:

with data as (select * from (values
(1,0.8 ,'red'),
(3,0.76 ,'blue'),
(4,0.75 ,'blue'),
(7,0.743 ,'green'),
(5,0.742 ,'red'),
(6,0.741 ,'green'),
(8,0.6 ,'blue'),
(9,0.5 ,'blue'),
(11,0.47 ,'green'),
(12,0.45 ,'blue'),
(10,0.4 ,'red')
) v(id, rank, color)
), all_rows as (
select id, rank, color,
  row_number() over (order by rank desc) as row_id
FROM data
ORDER BY rank desc
), first_values as (
select id, rank, color, row_id,
  first_value(row_id) over (partition by color order by row_id range between 5 
  preceding and current row)
from all_rows
order by 5, rank desc
)
select id, rank, color, row_id,
first_value(first_value) over (partition by color order by row_id range between 5 preceding and current row) as overall_rank
FROM first_values
ORDER BY overall_rank, rank desc
;
 id | rank  | color | row_id | overall_rank
----+-------+-------+--------+--------------
  1 |   0.8 | red   |      1 |            1
  5 | 0.742 | red   |      5 |            1
  3 |  0.76 | blue  |      2 |            2
  4 |  0.75 | blue  |      3 |            2
  8 |   0.6 | blue  |      7 |            2
  9 |   0.5 | blue  |      8 |            2
 12 |  0.45 | blue  |     10 |            2
  7 | 0.743 | green |      4 |            4
  6 | 0.741 | green |      6 |            4
 11 |  0.47 | green |      9 |            4
 10 |   0.4 | red   |     11 |           11
(11 rows)

【讨论】:

以上是关于postgresql某数据表中有多天的记录存在,我想取某天的第一条和最后一条记录,数据库查询语句怎么写的主要内容,如果未能解决你的问题,请参考以下文章

Postgresql:如何用n步对组中的记录进行排序

在SQL中如何快速查询某条记录在所有表中是不是存在?

postgresql按工作日选择,包括rails中的空记录

根据包含多天值的记录创建每日日志

假设某数据库表中有一个年龄字段,查找30-40岁之间的记录。问以上的查询

在 Java 中,调用 PostgreSQL 函数,为啥我收到一个错误,通知该函数不存在?