Where 子句仅适用于部分视图

Where clause only for part of the view

在@forpas 的帮助下,我有这个查询:dbfiddle

列 ROWdifferencesALWAYS 计算最后一行和最后一次出现之间的行数。完全独立于列 'date'.

我添加了 ROWdifferencesMAXDATE 列,因为我还想知道最后一行和它最后一次发生之间的行数,仅适用于 MAX 日期(在本例中为 2022-01-14)。对于此列,并非列 'number' 中的所有可能值都存在。在这种情况下,ROWdifferencesMAXDATE 应该是具有此 MAX(date) 的行数(在本例中为 3)。

其他列不应受到此更改的影响。我试过 WHERE MAX(date) 等,但后来我得到的记录较少。这在某种程度上可能吗?

在此先感谢您!

这个新专栏的预期结果:

number ROWdifferencesMAXDATE
3 3
12 1
14 0
25 3
38 3
41 2
73 3

您可以通过添加一个为每个日期的行编号的字段来扩展对上一个问题的答案,然后当该数字出现在该日期时,您可以根据该行号和总行数计算其位置最大日期值;否则它的位置就是最大日期的总行数。

WITH gdata AS (
  SELECT MAX(date) AS maxdate,
         COUNT(*) AS numrows
  FROM numbers
),
rowdata AS (
  SELECT *,
         ROW_NUMBER() OVER (ORDER BY date, id) AS rn,
         ROW_NUMBER() OVER (PARTITION BY date ORDER BY id) AS drn,
         SUM(date = maxdate) OVER () AS numdate
  FROM numbers
  CROSS JOIN gdata
)
SELECT number,
       COUNT(*) AS occurrences,
       MIN(numrows - rn) AS ROWdifferencesALWAYS,
       MIN(CASE WHEN date = maxdate THEN numdate - drn
                ELSE numdate
           END) AS ROWdifferencesMAXDATE
FROM rowdata
GROUP BY number
ORDER BY number

输出:


number  occurrences ROWdifferencesALWAYS    ROWdifferencesMAXDATE
3       1           5                       3
12      1           1                       1
14      1           0                       0
25      1           7                       3
38      1           3                       3
41      2           2                       2
73      1           4                       3

Demo on dbfiddle