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

后端 未结 19 2111
余生分开走
余生分开走 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:30

    I know that question is old, but I was still in the need of the answer and was not happy with other answers so I had to devise my own which is a twist on @paxdiablo´s answer.


    I came from land of SAP ASE 16.0, and I only needed a peek at statistics of certain data which are IMHO validly stored in different columns of a single row (they represent different times - when arrival of something was planned, what it was expected when the action started and finally what was the actual time). Thus I had transposed columns into the rows of temporary table and preformed my query over this as usually.

    N.B. Not the one-size-fits-all solution ahead!

    CREATE TABLE #tempTable (ID int, columnName varchar(20), dataValue int)
    
    INSERT INTO #tempTable 
      SELECT ID, 'Col1', Col1
        FROM sourceTable
       WHERE Col1 IS NOT NULL
    INSERT INTO #tempTable 
      SELECT ID, 'Col2', Col2
        FROM sourceTable
       WHERE Col2 IS NOT NULL
    INSERT INTO #tempTable 
      SELECT ID, 'Col3', Col3
        FROM sourceTable
       WHERE Col3 IS NOT NULL
    
    SELECT ID
         , min(dataValue) AS 'Min'
         , max(dataValue) AS 'Max'
         , max(dataValue) - min(dataValue) AS 'Diff' 
      FROM #tempTable 
      GROUP BY ID
    

    This took some 30 seconds on source set of 630000 rows and used only index-data, so not the thing to run in time-critical process but for things like one-time data inspection or end-of-the-day report you might be fine (but verify this with your peers or superiors, please!). Main bonus of this style for me was that I could readily use more/less columns and change grouping, filtering, etc., especially once data was copyied over.

    The additional data (columnName, maxes, ...) were to aid me in my search, so you might not need them; I left them here to maybe spark some ideas :-).

提交回复
热议问题