PostgresSQL查询

PostgresSQL查询,sql,postgresql,Sql,Postgresql,如果我有如下表格: Meter Serial Date | Reading A 2017-01-01 10 B 2017-02-10 20 A 2017-03-05 20 B 2017-05-01 100 A 2017-06-01 300 Meter | Date Start | S

如果我有如下表格:

Meter Serial    Date       |  Reading
    A          2017-01-01      10
    B          2017-02-10      20
    A          2017-03-05      20
    B          2017-05-01      100
    A          2017-06-01      300
Meter   |    Date Start  |  Start Reading  |  Date End  |  End Reading
 A           2017-01-01          10          2017-03-05      20
 B           2017-02-10          20          2017-05-01      30
 A           2017-03-05          20          2017-06-01      300
是否可以获得如下显示的查询:

Meter Serial    Date       |  Reading
    A          2017-01-01      10
    B          2017-02-10      20
    A          2017-03-05      20
    B          2017-05-01      100
    A          2017-06-01      300
Meter   |    Date Start  |  Start Reading  |  Date End  |  End Reading
 A           2017-01-01          10          2017-03-05      20
 B           2017-02-10          20          2017-05-01      30
 A           2017-03-05          20          2017-06-01      300
注意:读数并非每天都有。但它们在给定的一天是唯一的(例如,您不能在同一天有两个读数)

这是我正在处理的当前查询:

with tbl as (select row_number() over(order by read_date) as rn, meter_serial, meter_channel, total_meter_read, read_date
from meter_reading_total)
select l.meter_serial, l.read_date, l.total_meter_read, r.read_date, r.total_meter_read
from tbl as l
left outer join
tbl as r
on r.rn = l.rn + 1
and r.meter_serial = l.meter_serial
and r.meter_channel = l.meter_channel
如果希望按日期自动加入,则按1天间隔自动加入。否则,如果需要按记录顺序将连接条件更改为r.id=l.id+1

如果您的表没有id列,则可以使用rownumber函数和cte 作为

order by dt
更改为
order by 1
将在日期范围内加入表,即使它们未排序

如果希望按日期自动加入,则按1天间隔自动加入。否则,如果需要按记录顺序将连接条件更改为r.id=l.id+1

如果您的表没有id列,则可以使用rownumber函数和cte 作为

order by dt
更改为
order by 1
将在日期范围内加入表格,即使这些日期范围未排序。

此选项应适用于:

SELECT sub1.meter, sub1.date as date_start, sub1.reading as start_reading, sub2.meter, sub2.date as date_end, sub2.reading as end_reading
FROM
(SELECT ROW_NUMBER() OVER(ORDER BY meter, date ASC) AS row, t.*
FROM t) sub1
INNER JOIN
(SELECT ROW_NUMBER() OVER(ORDER BY meter, date ASC) AS row, t.*
FROM t) sub2 ON sub1.row = sub2.row -1
AND sub1.meter = sub2.meter
在这里试试:

这个应该可以:

SELECT sub1.meter, sub1.date as date_start, sub1.reading as start_reading, sub2.meter, sub2.date as date_end, sub2.reading as end_reading
FROM
(SELECT ROW_NUMBER() OVER(ORDER BY meter, date ASC) AS row, t.*
FROM t) sub1
INNER JOIN
(SELECT ROW_NUMBER() OVER(ORDER BY meter, date ASC) AS row, t.*
FROM t) sub2 ON sub1.row = sub2.row -1
AND sub1.meter = sub2.meter
请在此处尝试:

窗口功能FTW

SELECT
  meter_serial,
  meter_date                     AS start_date,
  readings                       AS start_reads,
  lead(meter_date) OVER read_wdw AS end_date,
  lead(readings)   OVER read_wdw AS end_reads
FROM read_meter
WINDOW read_wdw AS (
  PARTITION BY meter_serial
  ORDER BY     meter_date ASC
)
ORDER BY start_date ASC
下面是本例的示例。

窗口功能FTW

SELECT
  meter_serial,
  meter_date                     AS start_date,
  readings                       AS start_reads,
  lead(meter_date) OVER read_wdw AS end_date,
  lead(readings)   OVER read_wdw AS end_reads
FROM read_meter
WINDOW read_wdw AS (
  PARTITION BY meter_serial
  ORDER BY     meter_date ASC
)
ORDER BY start_date ASC

以下是本例的示例。

该表的日期范围不相等。看看第四个读数。我想我面临的问题是,我在同一张表中有多个仪表,我需要按仪表排序。在问题的底部,我将发布我正在运行的实际查询将
row\u number()over(按读取日期排序)
更改为
row\u number()over(按米划分\u按读取日期排序)
在您的查询表中该表的日期范围不相等。看看第四个读数。我想我面临的问题是,我在同一张表中有多个仪表,我需要按仪表排序。在问题的底部,我将发布我正在运行的实际查询,将查询名结果中的
row\u number()改为
row\u number()(按读取日期排序)
。我只在两天相隔只有一天的情况下得到结果,但我需要一个范围。我想这是因为我需要更多的信息。e、 g.同一表格中的不同仪表。已经更新了问题…相同的结果。我只在两天相隔只有一天的情况下得到结果,但我需要一个范围。我想这是因为我需要更多的信息。e、 g.同一表格中的不同仪表。已经更新了问题。。。