当前位置: 首页 > 面试题库 >

返回年份的数组作为年份范围

巫马俊力
2023-03-14
问题内容

我试图查询包含charactervarying[]年份列的表,并以逗号分隔的年份范围的字符串形式返回这些年份。年份范围将由数组中出现的连续年份确定,非连续年份/年份范围应以逗号分隔。

character varying[]而不是数据类型的原因integer[]是,其中一些值包含ALL而不是年份列表。我们可以忽略这些结果。

到目前为止,我几乎没有运气解决这个问题,因为我什至不知道从哪里开始。

有人可以给我一些指导或提供一些有用的示例来说明如何解决诸如挑战之类的问题吗?

years_table 例子

+=========+============================+
| id      | years                      |
| integer | character varying[]        |
+=========+============================+
| 1       | {ALL}                      |
| 2       | {1999,2000,2010,2011,2012} |
| 3       | {1990,1991,2007}           |
+---------+----------------------------+

产出目标:

示例SQL查询:

SELECT id, [year concat logic] AS year_ranges
FROM years_table WHERE 'ALL' NOT IN years

结果:

+====+======================+
| id | year_ranges          |
+====+======================+
| 2  | 1999-2000, 2010-2012 |
| 3  | 1990-1991, 2007      |
+----+----------------------+

问题答案:

SELECT id, string_agg(year_range, ‘, ‘) AS year_ranges
FROM (
SELECT id, CASE WHEN count() > 1
THEN min(year)::text || ‘-‘ || max(year)::text
ELSE min(year)::text
END AS year_range
FROM (
SELECT
, row_number() OVER (ORDER BY id, year) - year AS grp
FROM (
SELECT id, unnest(years) AS year
FROM (VALUES (2::int, ‘{1999,2000,2010,2011,2012}’::int[])
,(3, ‘{1990,1991,2007}’)
) AS tbl(id, years)
) sub1
) sub2
GROUP BY id, grp
ORDER BY id, min(year)
) sub3
GROUP BY id
ORDER BY id

产生 恰到好处 的结果。

如果处理数组varchar(varchar[],则将其转换为int[],然后再继续操作。这似乎是完全合法的形式:

years::int[]

在生产代码中,将内部子选择替换为源表的名称。

 FROM  (VALUES (2::int, '{1999,2000,2010,2011,2012}'::int[])
              ,(3,      '{1990,1991,2007}')
       ) AS tbl(id, years)

->

FROM  tbl

由于我们处理的是 自然递增的数字
(年份),因此我们可以使用快捷方式来形成连续年份(形成范围)的组。我从行号中减去年份本身(按年份排序)。对于连续的年份,行号和年份都加一并产生相同的grp数字。否则,新范围开始了。

在此处和此处的手册中,有关 窗口功能的
更多信息。



 类似资料:
  • 我试图只得到今年的数据,但我的“where子句”似乎有问题。但当我在where子句中输入特定年份时,它就起作用了。除了where子句之外,所有的东西都在工作。 我希望你们能帮我。

  • Excel单元格的日期格式为,显示日期为4位年份。然而,POI以另一种格式返回日期。单元格样式返回相同的格式,带有2位year。 有没有可能用POI获得与我在Excel中看到的格式相同的格式?

  • 问题内容: 我有一个年份值和一年中的某天,并想转换为日期(天/月/年)。 问题答案:

  • 问题内容: 我有以下数据框: 我需要按年份和月份对数据进行分组。例如:按2013年1月,2013年2月,2013年3月等分组。我将使用新分组的数据创建一个显示每年/每月abc vs xyz的图表。 我已经尝试了groupby和sum的各种组合,但是似乎什么也无法工作。 感谢您的协助。 问题答案: 您可以使用重采样或(在后台重采样)。 首先,请确保datetime列实际上是datetimes(用命中

  • 问题内容: Java 8的类有一个方法,,它使您可以从字符串A-z,a-z字母定义格式。这些例子并没有明确的区别y,今年的时代和Y,以星期为一年。它是什么? 问题答案: 与2006-W52一样,这是“年-周”样式日期的年值。如果有问题的一周跨越年份边界,则可能偏离年份值+1或-1。

  • 使用Datepicker,默认情况下,“年份”下拉列表只显示10年。用户必须单击最后一年才能获得更多的年数。 我们如何将初始范围设置为100年,这样用户就会默认看到一个很大的列表呢?