【问题标题】:Order an SQL table by year and ranges of years按年份和年份范围对 SQL 表进行排序
【发布时间】:2017-03-16 13:09:57
【问题描述】:

我希望能够按以下方式对结果进行排序。

有两列,一列存储年份,另一列存储年份范围,有时还存储日期,如下所示:

2017    
2016
        2014–2016
        1980-ongoing
2013
2000    28-27 March
1970

目前,我将它们连接起来并按 DESC 排序,得到这个(显示连接的临时列):

order by CONCAT(IFNULL(CAST(Year_Pub AS VARCHAR(16)) THEN '' ELSE CAST(Year_Pub AS VARCHAR(16))), IFNULL(Date_Freeform THEN '' ELSE Date_Freeform)) DESC

结果是:

2017
2016
2014-2016
2013
200028-27 March
1980-ongoing
1970

但是,我想得到的是这个(想象一下这是一份简历或类似活动的列表):

1980-ongoing
2017
2016
2014-2016
2013
2000
1970

也就是说,如果有年份跨度,我希望首先出现正在进行的约定,按开始年份排序,然后有年份跨度按去年排序并与单个年份混合。日期仅在 Year_Pub 为 NULL 并且必须在连接之前删除时才会出现,我想。

分隔符是一个 ndash,所以我需要以某种方式拆分这些字符串,正如我从示例中看到的那样,这些示例显示了如何在一个列中有名字和姓氏的表中按姓氏排序,但这是一个更多复杂的情况,我对 SQL 不是很熟悉。

此外,此操作将在应用程序附带的表上执行,因此我不想将数据或列插入到他们的数据库中,以防万一出现问题。

ElevateDB 数据库上使用 SQL(SQL 2003 标准 (ANSI ISO/IEC 9075:2003),但通用解决方案也可以,我可以查找语法)。

感谢您的建议。

【问题讨论】:

  • 您的数据似乎难以阅读和解析。 28-27 March 是一个年份范围吗(可能数据会更像28/03-31/0828 May-01 November...?你有1980-ongoing,那么你有1990-now1991-keepgoing 还是.....?
  • @Pham 是的,我知道,但这就是我所拥有的。但是,它始终是“正在进行的”,并且始终是“00-00 月”,没有年份。我想,可以在 ndash 之后假设四个字符来获取年份或搜索“正在进行”的匹配,这应该可以。 '00-00 Month' 条目仅在年份也存在时才会出现,并且可以在连接之前忽略/删除。 ??
  • 啊,您的评论就是您问题的答案。现在您可以为此编写查询。
  • @Pham :) 问题是我对 SQL 及其功能和原理一无所知,最好看看如何形成它。例如,如何仅出于排序目的从表中删除某些内容而不会影响实际数据?

标签: sql


【解决方案1】:

这是实现结果的一种方法:

SELECT 
    year_pub,
    date_freeform,
    COALESCE(CAST(year_pub AS VARCHAR(4)), date_freeform) AS year_list
FROM
    table_name
ORDER BY
    COALESCE(CAST(year_pub AS VARCHAR(4)), 
            CASE WHEN RIGHT(date_freeform, 4) = 'oing' 
                THEN '9999' 
                ELSE RIGHT(date_freeform, 4)
            END
    ) DESC,
    date_freeform DESC;

【讨论】:

  • 太好了,谢谢。我会玩这个。一个问题是我很紧张不要弄乱数据,当你做COALESCE ... AS year_list时,这是否只是在内存中发生而对源表没有影响?这样当我运行另一个查询时,一切都会一样吗?
  • @SR98115 是的,SELECT 语句不会更改表中的数据。通常,它只会以您预期的输出格式读取和显示数据。
  • @Pham 非常感谢,这很好用。我提到它没有做的另一件事是按开始年份对ongoing 条目进行降序排序。一旦我将它们全部排序为9999,我该如何使用date_freeform 的左侧4 个字符进行另一次传递?
  • @SR98115 您可以使用我编辑的答案进行更改。但是对于您的补充信息,我的查询现在不对同一年份的记录进行排序,例如2000 28-27 March2000 01-02 February00-00 Month 是什么意思,例如28-27 March?)
  • 据我了解,您的代码也应该适用于这种二次排序,但事实并非如此。我肯定错过了什么。我的意思是,如果有很多 ongoing 条目,它们应该按降序排序,我认为你的最后一行应该这样做。但这不会发生,我得到的是这样的:1980-ongoing 2001-ongoing 1999-ongoing 2017 2016 2014-2016 2013 2000 1970 不排序相同的开始年份是可以的。
猜你喜欢
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-27
  • 2018-10-01
  • 2021-10-18
  • 2019-01-07
  • 1970-01-01
相关资源
最近更新 更多