[SQL] 여러 열의 SQL MAX?
SQL여러 열의 SQL MAX?
어떻게 여러 컬럼의 최대의 행당 1 개 값을 반환 할 :
TABLENAME
[Number, Date1, Date2, Date3, Cost]
나는 이런 식으로 뭔가를 반환해야합니다
[Number, Most_Recent_Date, Cost]
질문?
해결법
-
==============================
1.글쎄, 당신은 CASE 문을 사용할 수 있습니다 :
글쎄, 당신은 CASE 문을 사용할 수 있습니다 :
SELECT CASE WHEN Date1 >= Date2 AND Date1 >= Date3 THEN Date1 WHEN Date2 >= Date1 AND Date2 >= Date3 THEN Date2 WHEN Date3 >= Date1 AND Date3 >= Date2 THEN Date3 ELSE Date1 END AS MostRecentDate
[위 마이크로 소프트 SQL 서버 2008의 경우, 아래의 스벤의 간단한 대답을 고려할 수 있습니다.]
-
==============================
2.여기에 T-SQL 및 SQL Server를 사용하여 최대 기능에 대한 또 다른 좋은 솔루션입니다
여기에 T-SQL 및 SQL Server를 사용하여 최대 기능에 대한 또 다른 좋은 솔루션입니다
SELECT [Other Fields], (SELECT Max(v) FROM (VALUES (date1), (date2), (date3),...) AS value(v)) as [MaxDate] FROM [YourTableName]
-
==============================
3.당신이 MySQL을 사용하는 경우 사용할 수 있습니다
당신이 MySQL을 사용하는 경우 사용할 수 있습니다
SELECT GREATEST(col1, col2 ...) FROM table
-
==============================
4.시뮬레이션 피벗 해제 다음 UNPIVOT (1) 지금까지 가장 빠른 3 개 방법이 있습니다 훨씬 느린 (1)에 비해 여전히보다 빠른 (3) (2)
시뮬레이션 피벗 해제 다음 UNPIVOT (1) 지금까지 가장 빠른 3 개 방법이 있습니다 훨씬 느린 (1)에 비해 여전히보다 빠른 (3) (2)
CREATE TABLE dates ( number INT PRIMARY KEY , date1 DATETIME , date2 DATETIME , date3 DATETIME , cost INT ) INSERT INTO dates VALUES ( 1, '1/1/2008', '2/4/2008', '3/1/2008', 10 ) INSERT INTO dates VALUES ( 2, '1/2/2008', '2/3/2008', '3/3/2008', 20 ) INSERT INTO dates VALUES ( 3, '1/3/2008', '2/2/2008', '3/2/2008', 30 ) INSERT INTO dates VALUES ( 4, '1/4/2008', '2/1/2008', '3/4/2008', 40 ) GO
SELECT number , MAX(dDate) maxDate , cost FROM dates UNPIVOT ( dDate FOR nDate IN ( Date1, Date2, Date3 ) ) as u GROUP BY number , cost GO
SELECT number , ( SELECT MAX(dDate) maxDate FROM ( SELECT d.date1 AS dDate UNION SELECT d.date2 UNION SELECT d.date3 ) a ) MaxDate , Cost FROM dates d GO
;WITH maxD AS ( SELECT number , MAX(CASE rn WHEN 1 THEN Date1 WHEN 2 THEN date2 ELSE date3 END) AS maxDate FROM dates a CROSS JOIN ( SELECT 1 AS rn UNION SELECT 2 UNION SELECT 3 ) b GROUP BY Number ) SELECT dates.number , maxD.maxDate , dates.cost FROM dates INNER JOIN MaxD ON dates.number = maxD.number GO DROP TABLE dates GO
-
==============================
5.어느 의지 작업 아래 두 샘플의 :
어느 의지 작업 아래 두 샘플의 :
SELECT MAX(date_columns) AS max_date FROM ( (SELECT date1 AS date_columns FROM data_table ) UNION ( SELECT date2 AS date_columns FROM data_table ) UNION ( SELECT date3 AS date_columns FROM data_table ) ) AS date_query
두 번째는 애드온 lassevk의 대답이다.
SELECT MAX(MostRecentDate) FROM ( SELECT CASE WHEN date1 >= date2 AND date1 >= date3 THEN date1 WHEN date2 >= date1 AND date2 >= date3 THEN date2 WHEN date3 >= date1 AND date3 >= date2 THEN date3 ELSE date1 END AS MostRecentDate FROM data_table ) AS date_query
-
==============================
6.T-SQL의 경우 (MSSQL 2008+)
T-SQL의 경우 (MSSQL 2008+)
SELECT (SELECT MAX(MyMaxName) FROM ( VALUES (MAX(Field1)), (MAX(Field2)) ) MyAlias(MyMaxName) ) FROM MyTable1
-
==============================
7.성능 문제의 모든 종류의 원인 스칼라 함수, 가능하면 인라인 테이블 반환 함수에 논리를 포장하는 그것의 더 나은 있도록. 이것은 내가 10 일자 개까지의 목록에서 최소 / 최대 날짜를 선택 일부 사용자 정의 기능을 대체하는 데 사용되는 기능입니다. 1 백만 행 내 데이터 세트에서 테스트 할 때 나는 인라인 TVF는 임시 테이블에 결과 집합을 선택하는 것과 동일한 양의 시간을 1 분했다 쿼리를 살해하기 전에 스칼라 기능을 통해 15 분 걸렸다. 하여 SELECT 또는 CROSS 적용에서 하위 쿼리에서이 호출에게 기능을 사용하십시오.
성능 문제의 모든 종류의 원인 스칼라 함수, 가능하면 인라인 테이블 반환 함수에 논리를 포장하는 그것의 더 나은 있도록. 이것은 내가 10 일자 개까지의 목록에서 최소 / 최대 날짜를 선택 일부 사용자 정의 기능을 대체하는 데 사용되는 기능입니다. 1 백만 행 내 데이터 세트에서 테스트 할 때 나는 인라인 TVF는 임시 테이블에 결과 집합을 선택하는 것과 동일한 양의 시간을 1 분했다 쿼리를 살해하기 전에 스칼라 기능을 통해 15 분 걸렸다. 하여 SELECT 또는 CROSS 적용에서 하위 쿼리에서이 호출에게 기능을 사용하십시오.
CREATE FUNCTION dbo.Get_Min_Max_Date ( @Date1 datetime, @Date2 datetime, @Date3 datetime, @Date4 datetime, @Date5 datetime, @Date6 datetime, @Date7 datetime, @Date8 datetime, @Date9 datetime, @Date10 datetime ) RETURNS TABLE AS RETURN ( SELECT Max(DateValue) Max_Date, Min(DateValue) Min_Date FROM ( VALUES (@Date1), (@Date2), (@Date3), (@Date4), (@Date5), (@Date6), (@Date7), (@Date8), (@Date9), (@Date10) ) AS Dates(DateValue) )
-
==============================
8.
DECLARE @TableName TABLE (Number INT, Date1 DATETIME, Date2 DATETIME, Date3 DATETIME, Cost MONEY) INSERT INTO @TableName SELECT 1, '20000101', '20010101','20020101',100 UNION ALL SELECT 2, '20000101', '19900101','19980101',99 SELECT Number, Cost , (SELECT MAX([Date]) FROM (SELECT Date1 AS [Date] UNION ALL SELECT Date2 UNION ALL SELECT Date3 ) D ) [Most Recent Date] FROM @TableName
-
==============================
9.
SELECT CASE WHEN Date1 >= Date2 AND Date1 >= Date3 THEN Date1 WHEN Date2 >= Date3 THEN Date2 ELSE Date3 END AS MostRecentDate
이 밖에 쓸 약간 쉽게 케이스 문이 순서대로 평가대로 평가 단계를 건너 뜁니다.
-
==============================
10.불행하게도 라세의 대답은, 그러나 겉으로는 분명, 중요한 결함이있다. 그것은 NULL 값을 처리 할 수 없습니다. 날짜 1에서 모든 단일 NULL 값의 결과가 반환된다. 그 문제를 해결하기 위해 불행하게도 시도는 매우 혼란스러워하는 경향이 매우 잘 4 개 이상의 값으로 확장되지 않습니다.
불행하게도 라세의 대답은, 그러나 겉으로는 분명, 중요한 결함이있다. 그것은 NULL 값을 처리 할 수 없습니다. 날짜 1에서 모든 단일 NULL 값의 결과가 반환된다. 그 문제를 해결하기 위해 불행하게도 시도는 매우 혼란스러워하는 경향이 매우 잘 4 개 이상의 값으로 확장되지 않습니다.
databyss의 첫 번째 대답은 좋은 모습 (하고있다). 그러나 대답은 다중 테이블에서 쉽게 외삽 3 값 대신 하나의 테이블에서 간단한 3 개 값으로 가입 것인지 명확하지 않았다. 난 그냥 3 열의 최대를 얻기 위해 서브 쿼리로 이러한 쿼리를 돌려 피하기 위해 원도 나는 databyss의 좋은 생각이 좀 정리 될 수 꽤 확신했다.
그래서 속히, 여기 (databyss의 아이디어에서 파생 된) 내 솔루션입니다. 그것은 가입 다중 테이블의 효과를 시뮬레이션하는 크로스 조인 상수를 선택 사용한다. 참고로 중요한 것은 필요한 모든 별칭이 제대로을 통해 수행한다는 것입니다 (항상 그런 것은하지 않은)이 아주 간단하고 추가 열을 통해 상당히 확장 패턴을 유지합니다.
DECLARE @v1 INT , @v2 INT , @v3 INT --SET @v1 = 1 --Comment out SET statements to experiment with --various combinations of NULL values SET @v2 = 2 SET @v3 = 3 SELECT ( SELECT MAX(Vals) FROM ( SELECT v1 AS Vals UNION SELECT v2 UNION SELECT v3 ) tmp WHERE Vals IS NOT NULL -- This eliminates NULL warning ) AS MaxVal FROM ( SELECT @v1 AS v1 ) t1 CROSS JOIN ( SELECT @v2 AS v2 ) t2 CROSS JOIN ( SELECT @v3 AS v3 ) t3
-
==============================
11.문제 : 엔티티에 주어진 최소 속도 값을 선택 요구 사항 : 기관 비율은 null이 될 수 있습니다
문제 : 엔티티에 주어진 최소 속도 값을 선택 요구 사항 : 기관 비율은 null이 될 수 있습니다
[MinRateValue] = CASE WHEN ISNULL(FitchRating.RatingValue, 100) < = ISNULL(MoodyRating.RatingValue, 99) AND ISNULL(FitchRating.RatingValue, 100) < = ISNULL(StandardPoorsRating.RatingValue, 99) THEN FitchgAgency.RatingAgencyName WHEN ISNULL(MoodyRating.RatingValue, 100) < = ISNULL(StandardPoorsRating.RatingValue , 99) THEN MoodyAgency.RatingAgencyName ELSE ISNULL(StandardPoorsRating.RatingValue, 'N/A') END
냇에서이 답변에서 영감을
-
==============================
12.당신은 SQL 서버 2005를 사용하는 경우, 당신은 UNPIVOT 기능을 사용할 수 있습니다. 여기에 완벽한 예입니다 :
당신은 SQL 서버 2005를 사용하는 경우, 당신은 UNPIVOT 기능을 사용할 수 있습니다. 여기에 완벽한 예입니다 :
create table dates ( number int, date1 datetime, date2 datetime, date3 datetime ) insert into dates values (1, '1/1/2008', '2/4/2008', '3/1/2008') insert into dates values (1, '1/2/2008', '2/3/2008', '3/3/2008') insert into dates values (1, '1/3/2008', '2/2/2008', '3/2/2008') insert into dates values (1, '1/4/2008', '2/1/2008', '3/4/2008') select max(dateMaxes) from ( select (select max(date1) from dates) date1max, (select max(date2) from dates) date2max, (select max(date3) from dates) date3max ) myTable unpivot (dateMaxes For fieldName In (date1max, date2max, date3max)) as tblPivot drop table dates
-
==============================
13.CROSS은 (2005 + 용) 적용하여 ....
CROSS은 (2005 + 용) 적용하여 ....
SELECT MostRecentDate FROM SourceTable CROSS APPLY (SELECT MAX(d) MostRecentDate FROM (VALUES (Date1), (Date2), (Date3)) AS a(d)) md
-
==============================
14.SQL 서버 2012에서 우리는 IIF를 사용할 수 있습니다.
SQL 서버 2012에서 우리는 IIF를 사용할 수 있습니다.
DECLARE @Date1 DATE='2014-07-03'; DECLARE @Date2 DATE='2014-07-04'; DECLARE @Date3 DATE='2014-07-05'; SELECT IIF(@Date1>@Date2, IIF(@Date1>@Date3,@Date1,@Date3), IIF(@Date2>@Date3,@Date2,@Date3)) AS MostRecentDate
-
==============================
15.UNPIVOT을 사용하여 보시기 바랍니다 :
UNPIVOT을 사용하여 보시기 바랍니다 :
SELECT MAX(MaxDt) MaxDt FROM tbl UNPIVOT (MaxDt FOR E IN (Date1, Date2, Date3) )AS unpvt;
-
==============================
16.내 가정이있는 사람과 같은 다른 가능한 솔루션에 비해 가능한 성능 저하에 미치는 영향을 최소화해야한다는 것입니다 내가 기반으로 솔루션을 선호하는 경우 대소, 값 (), 사용자 정의 함수 등을 단면적을 적용
내 가정이있는 사람과 같은 다른 가능한 솔루션에 비해 가능한 성능 저하에 미치는 영향을 최소화해야한다는 것입니다 내가 기반으로 솔루션을 선호하는 경우 대소, 값 (), 사용자 정의 함수 등을 단면적을 적용
여기서, 케이스 - 인 경우 버전 핸들 가능한 테스트 케이스 가장 Null 값한다 :
SELECT CASE WHEN Date1 > coalesce(Date2,'0001-01-01') AND Date1 > coalesce(Date3,'0001-01-01') THEN Date1 WHEN Date2 > coalesce(Date3,'0001-01-01') THEN Date2 ELSE Date3 END AS MostRecentDate , * from (values ( 1, cast('2001-01-01' as Date), cast('2002-01-01' as Date), cast('2003-01-01' as Date)) ,( 2, cast('2001-01-01' as Date), cast('2003-01-01' as Date), cast('2002-01-01' as Date)) ,( 3, cast('2002-01-01' as Date), cast('2001-01-01' as Date), cast('2003-01-01' as Date)) ,( 4, cast('2002-01-01' as Date), cast('2003-01-01' as Date), cast('2001-01-01' as Date)) ,( 5, cast('2003-01-01' as Date), cast('2001-01-01' as Date), cast('2002-01-01' as Date)) ,( 6, cast('2003-01-01' as Date), cast('2002-01-01' as Date), cast('2001-01-01' as Date)) ,( 11, cast(NULL as Date), cast('2002-01-01' as Date), cast('2003-01-01' as Date)) ,( 12, cast(NULL as Date), cast('2003-01-01' as Date), cast('2002-01-01' as Date)) ,( 13, cast('2003-01-01' as Date), cast(NULL as Date), cast('2002-01-01' as Date)) ,( 14, cast('2002-01-01' as Date), cast(NULL as Date), cast('2003-01-01' as Date)) ,( 15, cast('2003-01-01' as Date), cast('2002-01-01' as Date), cast(NULL as Date)) ,( 16, cast('2002-01-01' as Date), cast('2003-01-01' as Date), cast(NULL as Date)) ,( 21, cast('2003-01-01' as Date), cast(NULL as Date), cast(NULL as Date)) ,( 22, cast(NULL as Date), cast('2003-01-01' as Date), cast(NULL as Date)) ,( 23, cast(NULL as Date), cast(NULL as Date), cast('2003-01-01' as Date)) ,( 31, cast(NULL as Date), cast(NULL as Date), cast(NULL as Date)) ) as demoValues(id, Date1,Date2,Date3) order by id ;
그 결과는 다음과 같습니다
MostRecent id Date1 Date2 Date3 2003-01-01 1 2001-01-01 2002-01-01 2003-01-01 2003-01-01 2 2001-01-01 2003-01-01 2002-01-01 2003-01-01 3 2002-01-01 2001-01-01 2002-01-01 2003-01-01 4 2002-01-01 2003-01-01 2001-01-01 2003-01-01 5 2003-01-01 2001-01-01 2002-01-01 2003-01-01 6 2003-01-01 2002-01-01 2001-01-01 2003-01-01 11 NULL 2002-01-01 2003-01-01 2003-01-01 12 NULL 2003-01-01 2002-01-01 2003-01-01 13 2003-01-01 NULL 2002-01-01 2003-01-01 14 2002-01-01 NULL 2003-01-01 2003-01-01 15 2003-01-01 2002-01-01 NULL 2003-01-01 16 2002-01-01 2003-01-01 NULL 2003-01-01 21 2003-01-01 NULL NULL 2003-01-01 22 NULL 2003-01-01 NULL 2003-01-01 23 NULL NULL 2003-01-01 NULL 31 NULL NULL NULL
-
==============================
17.당신은 당신이 날짜를 전달한 함수를 만든 다음 아래와 같이 select 문에 기능을 추가 할 수 있습니다. 번호, dbo.fxMost_Recent_Date (날짜 1, 날짜 2, Date3) 비용을 선택
당신은 당신이 날짜를 전달한 함수를 만든 다음 아래와 같이 select 문에 기능을 추가 할 수 있습니다. 번호, dbo.fxMost_Recent_Date (날짜 1, 날짜 2, Date3) 비용을 선택
create FUNCTION fxMost_Recent_Date
( @ 날짜 1 smalldatetime으로, @ DATE2 smalldatetime으로, @ Date3 smalldatetime으로 ) RETURNS는 SMALLDATETIME 같이 BEGIN DECLARE의 @Result의 smalldatetime으로
declare @MostRecent smalldatetime set @MostRecent='1/1/1900' if @Date1>@MostRecent begin set @MostRecent=@Date1 end if @Date2>@MostRecent begin set @MostRecent=@Date2 end if @Date3>@MostRecent begin set @MostRecent=@Date3 end RETURN @MostRecent
종료
-
==============================
18.http://www.experts-exchange.com/Microsoft/Development/MS-SQL-Server/Q_24204894.html에서 ScottPletcher의 솔루션을 기반으로 나는 UNION ALL을 사용하여 최대 13 개 날짜 값의 최대 찾는 기능 (예를 들어 GetMaxOfDates3, GetMaxOfDates13)의 집합을 만들었습니다. 같은 행에서 값의 최대를 얻기 위해 T-SQL 함수를 참조 이러한 기능을 작성하는 시간 그러나 내가 고려하지 않은 UNPIVOT 솔루션
http://www.experts-exchange.com/Microsoft/Development/MS-SQL-Server/Q_24204894.html에서 ScottPletcher의 솔루션을 기반으로 나는 UNION ALL을 사용하여 최대 13 개 날짜 값의 최대 찾는 기능 (예를 들어 GetMaxOfDates3, GetMaxOfDates13)의 집합을 만들었습니다. 같은 행에서 값의 최대를 얻기 위해 T-SQL 함수를 참조 이러한 기능을 작성하는 시간 그러나 내가 고려하지 않은 UNPIVOT 솔루션
-
==============================
19.사용 CASE 때 또 다른 방법
사용 CASE 때 또 다른 방법
SELECT CASE true WHEN max(row1) >= max(row2) THEN CASE true WHEN max(row1) >= max(row3) THEN max(row1) ELSE max(row3) end ELSE CASE true WHEN max(row2) >= max(row3) THEN max(row2) ELSE max(row3) END END FROM yourTable
-
==============================
20.여기에 좋은 솔루션입니다 :
여기에 좋은 솔루션입니다 :
CREATE function [dbo].[inLineMax] (@v1 float,@v2 float,@v3 float,@v4 float) returns float as begin declare @val float set @val = 0 declare @TableVal table (value float ) insert into @TableVal select @v1 insert into @TableVal select @v2 insert into @TableVal select @v3 insert into @TableVal select @v4 select @val= max(value) from @TableVal return @val end
-
==============================
21.(; 값 2; ... 값 1) 등을 수행하도록되어이 M $ ACCESS 도움에 ... 등 SQL에 있다면 나는 MAXA라는 함수가 모른다.
(; 값 2; ... 값 1) 등을 수행하도록되어이 M $ ACCESS 도움에 ... 등 SQL에 있다면 나는 MAXA라는 함수가 모른다.
희망은 사람을 도울 수 있습니다.
P.D : 값 등 열 또는 계산 사람이 될 수 있습니다
from https://stackoverflow.com/questions/71022/sql-max-of-multiple-columns by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 두 날짜 사이에 작업 일 카운트 (0) | 2020.03.09 |
---|---|
[SQL] 어떻게 PostgreSQL의에서 many-to-many 관계를 구현하는 방법? (0) | 2020.03.09 |
[SQL] 한 성명에서 자바 실행 여러 개의 쿼리 (0) | 2020.03.09 |
[SQL] 어떻게 마지막으로 삽입 된 ID를 얻는 방법? (0) | 2020.03.09 |
[SQL] 의 특정 값에 대한 모든 필드에서 모든 테이블을 검색 (오라클) (0) | 2020.03.09 |