What's the best way to select the minimum value from several columns?

后端 未结 19 2056
余生分开走
余生分开走 2020-11-27 02:47

Given the following table in SQL Server 2005:

ID   Col1   Col2   Col3
--   ----   ----   ----
1       3     34     76  
2      32    976     24
3       7             


        
相关标签:
19条回答
  • 2020-11-27 03:35

    If the columns were integers as in your example I would create a function:

    create function f_min_int(@a as int, @b as int) 
    returns int
    as
    begin
        return case when @a < @b then @a else coalesce(@b,@a) end
    end
    

    then when I need to use it I would do :

    select col1, col2, col3, dbo.f_min_int(dbo.f_min_int(col1,col2),col3)
    

    if you have 5 colums then the above becomes

    select col1, col2, col3, col4, col5,
    dbo.f_min_int(dbo.f_min_int(dbo.f_min_int(dbo.f_min_int(col1,col2),col3),col4),col5)
    
    0 讨论(0)
  • 2020-11-27 03:36

    If you know what values you are looking for, usually a status code, the following can be helpful:

    select case when 0 in (PAGE1STATUS ,PAGE2STATUS ,PAGE3STATUS,
    PAGE4STATUS,PAGE5STATUS ,PAGE6STATUS) then 0 else 1 end
    FROM CUSTOMERS_FORMS
    
    0 讨论(0)
  • 2020-11-27 03:38

    On MySQL, use this:

    select least(col1, col2, col3) FROM yourtable
    
    0 讨论(0)
  • 2020-11-27 03:38
    SELECT [ID],
                (
                    SELECT MIN([value].[MinValue])
                    FROM
                    (
                        VALUES
                            ([Col1]),
                            ([Col1]),
                            ([Col2]),
                            ([Col3])
                    ) AS [value] ([MinValue])
               ) AS [MinValue]
    FROM Table;
    
    0 讨论(0)
  • 2020-11-27 03:44

    If you're able to make a stored procedure, it could take an array of values, and you could just call that.

    0 讨论(0)
  • 2020-11-27 03:44

    Below I use a temp table to get the minimum of several dates. The first temp table queries several joined tables to get various dates (as well as other values for the query), the second temp table then gets the various columns and the minimum date using as many passes as there are date columns.

    This is essentially like the union query, the same number of passes are required, but may be more efficient (based on experience, but would need testing). Efficiency wasn't an issue in this case (8,000 records). One could index etc.

    --==================== this gets minimums and global min
    if object_id('tempdb..#temp1') is not null
        drop table #temp1
    if object_id('tempdb..#temp2') is not null
        drop table #temp2
    
    select r.recordid ,  r.ReferenceNumber, i.InventionTitle, RecordDate, i.ReceivedDate
    , min(fi.uploaddate) [Min File Upload], min(fi.CorrespondenceDate) [Min File Correspondence]
    into #temp1
    from record r 
    join Invention i on i.inventionid = r.recordid
    left join LnkRecordFile lrf on lrf.recordid = r.recordid
    left join fileinformation fi on fi.fileid = lrf.fileid
    where r.recorddate > '2015-05-26'
     group by  r.recordid, recorddate, i.ReceivedDate,
     r.ReferenceNumber, i.InventionTitle
    
    
    
    select recordid, recorddate [min date]
    into #temp2
    from #temp1
    
    update #temp2
    set [min date] = ReceivedDate 
    from #temp1 t1 join #temp2 t2 on t1.recordid = t2.recordid
    where t1.ReceivedDate < [min date] and  t1.ReceivedDate > '2001-01-01'
    
    update #temp2 
    set [min date] = t1.[Min File Upload]
    from #temp1 t1 join #temp2 t2 on t1.recordid = t2.recordid
    where t1.[Min File Upload] < [min date] and  t1.[Min File Upload] > '2001-01-01'
    
    update #temp2
    set [min date] = t1.[Min File Correspondence]
    from #temp1 t1 join #temp2 t2 on t1.recordid = t2.recordid
    where t1.[Min File Correspondence] < [min date] and t1.[Min File Correspondence] > '2001-01-01'
    
    
    select t1.*, t2.[min date] [LOWEST DATE]
    from #temp1 t1 join #temp2 t2 on t1.recordid = t2.recordid
    order by t1.recordid
    
    0 讨论(0)
提交回复
热议问题