定期更新表(递增Load_id).如何 Select

  • name中的for each
  • the lastcount中的两个值
  • 其中,lastmax(load_id) per day给出的
  • 然后把它们放在side by side块?

Input

name,day,count,load_id
John,10,9,14
John,9,5,12
John,9,7,13
John,8,5,12
John,8,2,11
Paul,9,0,12
Paul,9,1,13
Paul,7,1,11
Paul,7,9,10
Mark,7,10,11
Mark,7,11,10
Ned,7,0,10

步骤1-每天最后一次记录

name,day,count
John,10,9
John,9,7
John,8,5
Paul,9,1
Paul,7,1
Mark,7,10
Ned,7,0

Output

name,last_day_last_count,prev_day_last_count
John,9,7
Paul,1,1
Mark,10,NULL
Ned,0,NULL

Attempt

WITH RankedData AS (
  SELECT
    name,
    day,
    count,
    load_id,
    ROW_NUMBER() OVER (PARTITION BY name, day ORDER BY load_id DESC) AS rn
  FROM test
)

SELECT *
FROM RankedData
WHERE rn = 1
ORDER BY name, day DESC

Fiddle

推荐答案

nameday进行聚合分组,以找到MAX最小值load_id和相应的count,然后使用ROW_NUMBER for each 人按DESC结束load_id对行进行编号,最后使用PIVOT获得最新的2个值作为列,而不是行:

SELECT *
FROM   (
  SELECT name,
         MAX(count) KEEP (DENSE_RANK LAST ORDER BY load_id) AS count,
         ROW_NUMBER() OVER (PARTITION BY name ORDER BY MAX(load_id) DESC) AS rn
  FROM   test
  GROUP BY name, day
)
PIVOT(
  MAX(count) FOR rn IN (
    1 AS last_day_count,
    2 AS prev_day_count
  )
)

或者在两次传递中使用ROW_NUMBER:

SELECT *
FROM   (
  SELECT name,
         count,
         ROW_NUMBER() OVER (PARTITION BY name ORDER BY load_id DESC)
           AS rn_by_person
  FROM   (
    SELECT name,
           load_id,
           count,
           ROW_NUMBER() OVER (PARTITION BY name, day ORDER BY load_id DESC)
             AS rn_by_day
    FROM   test
  )
  WHERE  rn_by_day = 1
)
PIVOT(
  MAX(count) FOR rn_by_person IN (
    1 AS last_day_count,
    2 AS prev_day_count
  )
)

对于样本数据,这两个输出都是:

NAME LAST_DAY_COUNT PREV_DAY_COUNT
John 9 7
Mark 10 null
Ned 0 null
Paul 1 1

要获得相应的load_id分,请执行以下操作:

SELECT *
FROM   (
  SELECT name,
         MAX(count) KEEP (DENSE_RANK LAST ORDER BY load_id) AS count,
         MAX(load_id) AS load_id,
         ROW_NUMBER() OVER (PARTITION BY name ORDER BY MAX(load_id) DESC) AS rn
  FROM   test
  GROUP BY name, day
)
PIVOT(
  MAX(count) AS count,
  MAX(load_id) AS load_id
  FOR rn IN (
    1 AS last_day,
    2 AS prev_day
  )
)

SELECT *
FROM   (
  SELECT name,
         load_id,
         count,
         ROW_NUMBER() OVER (PARTITION BY name ORDER BY load_id DESC)
           AS rn_by_person
  FROM   (
    SELECT name,
           load_id,
           count,
           ROW_NUMBER() OVER (PARTITION BY name, day ORDER BY load_id DESC)
             AS rn_by_day
    FROM   test
  )
  WHERE  rn_by_day = 1
)
PIVOT(
  MAX(count) AS count,
  MAX(load_id) AS load_id
  FOR rn_by_person IN (
    1 AS last_day,
    2 AS prev_day
  )
)

这两项输出都是:

NAME LAST_DAY_COUNT LAST_DAY_LOAD_ID PREV_DAY_COUNT PREV_DAY_LOAD_ID
John 9 14 7 13
Mark 10 11 null null
Ned 0 10 null null
Paul 1 13 1 11

fiddle

Sql相关问答推荐

获取家谱树中第一次出现的特定信息,然后停止

在请求结束之前,PostgreSQL不会考虑使用中的删除

为什么两个不同的窗口函数给出不同的排序结果?

如何实现同一列的递归计算?

在一个子查询中签入ID';S,如果未返回,则签入另一个子查询

Oracle 23c ROUND,数据类型为DATE

按用户和时间列出的SQL Group考勤列表

删除所有订单中可用的重复值

SQL 查找 varchar 类型列及其值中多次出现的子字符串

PostgreSQL:从多个字段收集特定指标的最后一个条目

在 Oracle 21c 中透视文本值

没有调用子查询的嵌套 JOIN语法是什么?

SQL ORACLE - 查找连续天数

每次计数器增加时通过运行总重置进行分组

强制 SQL 始终通过 R 从视图中返回至少一行

使用其他表 SUM 的交换价格转换价格并获得 AVG

在 postgresql 中保存带有时间戳的几何类型数据

从每行中排除最大元素

交叉应用 OPENJSON / PIVOT - 错误的顺序

如何比较同一张表中的行并进行相应更新