Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 根据最近的日期获取不同的值_Sql_Sql Server - Fatal编程技术网

Sql 根据最近的日期获取不同的值

Sql 根据最近的日期获取不同的值,sql,sql-server,Sql,Sql Server,我试图根据最近的日期得出不同的结果。如果我的id字段有小数,那么我希望小数点后的数字被截断。我的id字段是ntext格式 输入: 名称 身份证件 日期1 日期2 A. 2. 12/25/2020 12/15/2021 B 3R 10/08/2019 11/18/2019 ab 2 12/26/2020 12/16/2021 C 4. 01/11/2018 10/06/2019 ck 4.4 04/01/2020 04/05/2021 公元 2.999 04/02/2021 04/05/2021

我试图根据最近的日期得出不同的结果。如果我的id字段有小数,那么我希望小数点后的数字被截断。我的id字段是ntext格式

输入:

名称 身份证件 日期1 日期2 A. 2. 12/25/2020 12/15/2021 B 3R 10/08/2019 11/18/2019 ab 2 12/26/2020 12/16/2021 C 4. 01/11/2018 10/06/2019 ck 4.4 04/01/2020 04/05/2021 公元 2.999 04/02/2021 04/05/2021
这里是如何做到这一点的,我假设id是decimal或number类型

select * from 
   (
    select * , ROW_NUMBER() over (partition by id - id % 1 order by date1 desc) rn
    from yourtable
   )
where rn = 1
如果id是string,则将其转换为int:

select name,convert(numeric(38, 0), id) id , date1, date2 from 
   (
    select * , ROW_NUMBER() over (partition by convert(numeric(38, 0), id) as int) order by date1 desc) rn
    from yourtable
    where isnumeric(id) = 1
   )
where rn = 1
如果您还想包括非数字:

select name,convert(numeric(38, 0), id) id , date1, date2 from 
   (
    select * , ROW_NUMBER() over (partition by case when isnumeric(id) = 1 then convert(numeric(38, 0), id) else id end order by date1 desc) rn
    from yourtable     
   )
where rn = 1

这里是如何做到这一点的,我假设id是decimal或number类型

select * from 
   (
    select * , ROW_NUMBER() over (partition by id - id % 1 order by date1 desc) rn
    from yourtable
   )
where rn = 1
如果id是string,则将其转换为int:

select name,convert(numeric(38, 0), id) id , date1, date2 from 
   (
    select * , ROW_NUMBER() over (partition by convert(numeric(38, 0), id) as int) order by date1 desc) rn
    from yourtable
    where isnumeric(id) = 1
   )
where rn = 1
如果您还想包括非数字:

select name,convert(numeric(38, 0), id) id , date1, date2 from 
   (
    select * , ROW_NUMBER() over (partition by case when isnumeric(id) = 1 then convert(numeric(38, 0), id) else id end order by date1 desc) rn
    from yourtable     
   )
where rn = 1

我建议将其转换为数字:

select convert(numeric(38, 0), id)
如果列中的数字无效,您可能真的希望
尝试\u convert()

如果它是一个字符串,您还可以使用字符串函数获取第一个
之前的所有内容。

select left(id, charindex('.', id + '.') - 1)

请注意
+'.
。这可以防止没有小数点时出现任何错误。

我建议将其转换为数字:

select convert(numeric(38, 0), id)
如果列中的数字无效,您可能真的希望
尝试\u convert()

如果它是一个字符串,您还可以使用字符串函数获取第一个
之前的所有内容。

select left(id, charindex('.', id + '.') - 1)


请注意
+'.
。这可以防止在没有小数点时出现任何错误。

请提供完整的查询。我尝试过,但在剥离小数点和非小数点id时遇到了问题,而且在提取每个id的最新日期时也遇到了问题。自2005年以来,ntext已被弃用。你为什么现在用它?如果可以安全地(可能不太可能)假设列包含有效的数值,则可能需要使用can truncate帮助您转换?请提供完整的查询。我尝试过,但在剥离十进制和非十进制id时遇到了困难,而且在提取每个id的最新日期时也遇到了困难。ntext自2005年以来一直被弃用。你为什么现在用它?如果您可以安全地(可能不太可能)假设您的列包含有效的数值,那么可以截断-这似乎是您所需要的。可以转换(id为int)来帮助您进行转换吗?嘿,谢谢!但是它说“将nvarchar值转换为int数据类型时转换失败”嗯。。在id列中是否有任何非数值?有一个id类似于“G566 006”,那么我假设您想将其过滤掉,请参阅我更新的AsnWell这是另一个问题,根据您的问题,这是解决方案,但如果有更多问题,您应该将其包括在问题中。嘿,谢谢!但是它说“将nvarchar值转换为int数据类型时转换失败”嗯。。在id列中是否有非数值?有一个id类似于“G566 006”,那么我假设您想将其过滤掉,请参阅我更新的AsnWell这是另一个问题,根据您的问题,这是解决方案,但如果有更多问题,您应该将其包括在问题中。X Gordon,这仍然会给我十进制值“988.00”。我想去掉decimal@New_here…我调整了第二个,但两个都完全按照您的预期工作:。Thx Gordon,这仍然会给我十进制值“988.00”。我想去掉decimal@New_here…我调整了第二个,但两个都完全按照您的预期工作:。