简体   繁体   English

SQL通过将列舍入为最接近的值,基于两列返回不同的行

[英]SQL Return distinct rows based on two columns by rounding column to nearest value

Following is the Table: 以下是表格:

ID  C1  C2  C3  Date    C5  C6  Name
1   ### ### ### 9.53    ### ### ron
1   ### ### ### 9.57    ### ### ron
1   ### ### ### 9.87    ### ### ron
1   ### ### ### 10.2    ### ### jess
1   ### ### ### 10.2    ### ### jess
1   ### ### ### 11.3    ### ### mike
1   ### ### ### 11.3    ### ### mike
2   ### ### ### 16.58   ### ### ron
2   ### ### ### 16.33   ### ### ron
2   ### ### ### 16.45   ### ### ron
2   ### ### ### 22.43   ### ### jess
2   ### ### ### 22.88   ### ### jess
2   ### ### ### 19.2    ### ### mike
2   ### ### ### 19.51   ### ### mike

Following is what i am expecting: 以下是我所期待的:

Gettting distinct rows based on ID and Name, grouping by Date to nearest round number. 根据ID和名称获取不同的行,按日期分组到最接近的舍入数。

ID  C1  C2  C3  Date    C5  C6  Name
1   ### ### ### 9      ###  ### ron
1   ### ### ### 10     ###  ### jess
1   ### ### ### 11     ###  ### mike
2   ### ### ### 16     ###  ### ron
2   ### ### ### 22     ###  ### jess
2   ### ### ### 19     ###  ### mike

Can anyone help me on this? 谁可以帮我这个事?

is this helpful 这有用吗?

    create table #tmp (Date float, Name varchar(10))

    insert into #tmp values(9.53,'ron')
    insert into #tmp values(9.57,'ron')
    insert into #tmp values(9.87,'ron')

    insert into #tmp values(10.2,'jess')
    insert into #tmp values(10.2,'jess')

    insert into #tmp values(11.3,'mike')
    insert into #tmp values(11.3,'mike')

    insert into #tmp values(16.58,'ron')
    insert into #tmp values(16.33,'ron')
    insert into #tmp values(16.45,'ron')

    insert into #tmp values(22.43,'jess')
    insert into #tmp values(22.88,'jess')

    insert into #tmp values(19.2,'mike')
    insert into #tmp values(19.51,'mike')



    SELECT DISTINCT floor(Date) AS Date,Name from #tmp

    drop table #tmp

Try this: 尝试这个:

SELECT DISTINCT ID, Rounded_Date, Name
FROM
(SELECT ID, FLOOR(Date) Rounded_Date, Name FROM Your_Table);
CREATE TABLE #Table1
    ([ID] int, [C1] varchar(3), [C2] varchar(3), [C3] varchar(3), [Date] numeric(10,4), [C5] varchar(3), [C6] varchar(3), [Name] varchar(4))
;

INSERT INTO #Table1
    ([ID], [C1], [C2], [C3], [Date], [C5], [C6], [Name])
VALUES
    (1, '###', '###', '###', 9.53, '###', '###', 'ron'),
    (1, '###', '###', '###', 9.57, '###', '###', 'ron'),
    (1, '###', '###', '###', 9.87, '###', '###', 'ron'),
    (1, '###', '###', '###', 10.2, '###', '###', 'jess'),
    (1, '###', '###', '###', 10.2, '###', '###', 'jess'),
    (1, '###', '###', '###', 11.3, '###', '###', 'mike'),
    (1, '###', '###', '###', 11.3, '###', '###', 'mike'),
    (2, '###', '###', '###', 16.58, '###', '###', 'ron'),
    (2, '###', '###', '###', 16.33, '###', '###', 'ron'),
    (2, '###', '###', '###', 16.45, '###', '###', 'ron'),
    (2, '###', '###', '###', 22.43, '###', '###', 'jess'),
    (2, '###', '###', '###', 22.88, '###', '###', 'jess'),
    (2, '###', '###', '###', 19.2, '###', '###', 'mike'),
    (2, '###', '###', '###', 19.51, '###', '###', 'mike')
;
select  distinct [ID], [C1], [C2], [C3], cast(date as int), [C5], [C6], [Name]  from #Table1

Looking at your requirement, I think this might give you the expected result 看看你的要求,我认为这可能会给你预期的结果

;with cte
as
(
select
  SeqNo = row_number() over(partition by
                            ID,
  C1,
  C2,
  C3,
  cast(Date as int),
  C5,
  C6,
  Name order by id),
  ID,
  C1,
  C2,
  C3,
  Date,
  C5,
  C6,
  Name
  from t1

)
select
ID,
  C1,
  C2,
  C3,
  Date,
  C5,
  C6,
  Name
from cte where seqNo = 1

Check the Demo 检查演示

试试这个:

  select distinct id, round(date,0) as date,name from your_table;

You can use this code, 你可以使用这段代码,

select ID, C1, C2, C3, floor(Date) as RDate, C5, C6, Name
from your_table_name
group by ID, Name, RDate

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM