উত্তর:
ভাল, আপনি 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
[মাইক্রোসফ্ট এসকিউএল সার্ভার ২০০৮ এবং তারপরের জন্য, আপনি নীচে সোভেনের সহজ উত্তরটি বিবেচনা করতে পারেন]]
Max
টি-এসকিউএল এবং এসকিউএল সার্ভার ব্যবহার করে কার্যকারিতাটির জন্য আরও একটি দুর্দান্ত সমাধান এখানে
SELECT [Other Fields],
(SELECT Max(v)
FROM (VALUES (date1), (date2), (date3),...) AS value(v)) as [MaxDate]
FROM [YourTableName]
আপনি যদি মাইএসকিউএল ব্যবহার করেন তবে আপনি ব্যবহার করতে পারেন
SELECT GREATEST(col1, col2 ...) FROM table
আরও 3 টি পদ্ধতি রয়েছে যেখানে UNPIVOT
(1) এখন পর্যন্ত সবচেয়ে দ্রুত, সিমুলেটেড আনপাইভট (3) অনুসরণ করে যা (1) এর চেয়ে অনেক ধীর হলেও এখনও (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
UNPIVOT
)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
UNPIVOT
);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
নীচের দুটি নমুনার যে কোনওটিই কাজ করবে:
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
দ্বিতীয়টি লাসসেভকের উত্তরের একটি অ্যাড-অন ।
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
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
স্কেলার ফাংশন সমস্ত ধরণের পারফরম্যান্স সমস্যার কারণ হয়ে থাকে, সুতরাং যদি সম্ভব হয় তবে যুক্তিকে একটি ইনলাইন টেবিলের মূল্যবান ফাংশনে আবদ্ধ করা আরও ভাল। এটি আমি ব্যবহারকারীর সংজ্ঞায়িত ফাংশনগুলি প্রতিস্থাপন করতে ব্যবহৃত ফাংশন যা দশ তারিখের তালিকা থেকে ন্যূনতম / ম্যাক্স তারিখগুলি নির্বাচন করে। যখন আমার 1 মিলিয়ন সারিগুলির ডেটাসেটে পরীক্ষা করা হয়েছে তখন স্কেলার ফাংশনটি জিজ্ঞাসাটি মেরে ফেলার 15 মিনিটেরও বেশি সময় লেগেছিল ইনলাইন টিভিএফ 1 মিনিট সময় নিয়েছিল যা অস্থায়ী সারণীতে ফলাফল সেট নির্বাচন করার সময় একই পরিমাণ of এই কলটি নির্বাচন করতে হয় নির্বাচন করুন নির্বাচন করুন বা একটি ক্রস প্রয়োগের একটি subquery থেকে হয়।
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)
)
SELECT
CASE
WHEN Date1 >= Date2 AND Date1 >= Date3 THEN Date1
WHEN Date2 >= Date3 THEN Date2
ELSE Date3
END AS MostRecentDate
এটি লেখার পক্ষে সামান্য সহজ এবং কেস স্টেটমেন্টটি ক্রমে মূল্যায়ন করা হয় বলে মূল্যায়নের পদক্ষেপগুলি এড়িয়ে যায়।
দুর্ভাগ্যক্রমে লাসের উত্তরটি যদিও আপাতদৃষ্টিতে সুস্পষ্ট বলে মনে হচ্ছে তবে এর একটি গুরুত্বপূর্ণ ত্রুটি রয়েছে। এটি নুল মানগুলি পরিচালনা করতে পারে না। তারিখ 1-এ কোনও একক নূন্যমূল্যের ফলাফল ফেরত দেওয়া হচ্ছে। দুর্ভাগ্যক্রমে যে সমস্যাটি সমাধান করার কোনও প্রচেষ্টা চরম অগোছালো হয়ে যায় এবং 4 বা ততোধিক মানকে খুব সুন্দর করে স্কেল করে না।
ডাটাবাইসের প্রথম উত্তর দেখতে ভাল (এবং হ'ল)। তবে, কোনও একক টেবিল থেকে সহজ 3 টি মানের পরিবর্তে উত্তরটি কোনও বহু-টেবিল জোড়ায় 3 মানগুলিতে সহজেই এক্সট্রাপোল্ট হবে কিনা তা পরিষ্কার ছিল না। সর্বাধিক 3 টি কলামের জন্য আমি এই জাতীয় কোয়েরিকে একটি সাব-কোয়েরিতে পরিণত করা এড়াতে চেয়েছিলাম, এছাড়াও আমি নিশ্চিত যে ডাটাবাইসের দুর্দান্ত ধারণাটি কিছুটা সাফ করা যায়।
সুতরাং আরও অগ্রগতি ছাড়াই, এখানে আমার সমাধান (ডাটাবাইসের ধারণা থেকে প্রাপ্ত)।
এটি একটি বহু-টেবিলের যোগদানের প্রভাব অনুকরণ করতে ধ্রুবক নির্বাচন করে ক্রস যোগগুলিতে ব্যবহার করে। গুরুত্বপূর্ণ বিষয়টি লক্ষ্যনীয় হ'ল সমস্ত প্রয়োজনীয় উপমা সঠিকভাবে বহন করে (যা সর্বদা ক্ষেত্রে হয় না) এবং এটি অতিরিক্ত কলামগুলির মাধ্যমে প্যাটার্নটিকে বেশ সহজ এবং মোটামুটি স্কেলেবল রাখে।
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
সমস্যা: কোনও সত্তার প্রয়োজনীয়তাকে দেওয়া সর্বনিম্ন হারের মানটি চয়ন করুন: এজেন্সির হারগুলি শূন্য হতে পারে
[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
আপনি যদি এসকিউএল সার্ভার 2005 ব্যবহার করেন তবে আপনি ইউএনপিভোট বৈশিষ্ট্যটি ব্যবহার করতে পারেন। এখানে একটি সম্পূর্ণ উদাহরণ:
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
ক্রস প্রয়োগ করুন (2005+ এর জন্য) ....
SELECT MostRecentDate
FROM SourceTable
CROSS APPLY (SELECT MAX(d) MostRecentDate FROM (VALUES (Date1), (Date2), (Date3)) AS a(d)) md
এসকিউএল সার্ভার থেকে 2012 আমরা আইআইএফ ব্যবহার করতে পারি ।
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
DECLARE @Date1 DATE='2014-08-01'; DECLARE @Date2 DATE=null; DECLARE @Date3 DATE='2014-07-05'; /*this gets returned*/
select IIF(@Date1 > @Date2 or @Date2 is null, IIF(@Date1 > @Date3 or @Date3 is null, @Date1, @Date3), IIF(@Date2 > @Date3 or @Date3 is null, @Date2, @Date3)) as MostRecentDate
আমি কেস-এর ভিত্তিতে সমাধানগুলি পছন্দ করি, আমার ধারণাটি হ'ল ক্রস-প্রয়োগ, মান (), কাস্টম ফাংশন ইত্যাদির মতো অন্যান্য সম্ভাব্য সমাধানগুলির তুলনায় সম্ভাব্য পারফরম্যান্স ড্রপের উপর এটির কমপক্ষে প্রভাব হওয়া উচিত should
এখানে কেস-সংস্করণটি দেওয়া হয় যা বেশিরভাগ সম্ভাব্য পরীক্ষার ক্ষেত্রে নাল মানগুলি পরিচালনা করে:
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
আপনি একটি ফাংশন তৈরি করতে পারেন যেখানে আপনি তারিখগুলি পাস করেন এবং তারপরে নীচের মতো নির্বাচনের বিবৃতিতে ফাংশনটি যুক্ত করতে পারেন। সংখ্যা, dbo.fx মোস্ট_ রিসেন্ট_ তারিখ (তারিখ 1, তারিখ 2, তারিখ 3), মূল্য নির্বাচন করুন
create FUNCTION fxMost_Recent_Date
(@ তারিখ 1 ছোট তারিখের সময়, @ তারিখ 2 ছোট তারিখের সময়, @ তারিখ 3 ছোট তারিখের সময়) স্মার্টডেটটাইম ফেরত ফিরে আসে ডিসেম্বর থেকে শুরু করুন @ ফলাফল ছোট্ট তারিখের সময়
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
শেষ
স্কটপ্ল্যাচারের http://www.experts-exchange.com/Mic Microsoft / Development / MS - SQL - Server / Q_24204894.html এর সমাধানের ভিত্তিতে আমি সর্বাধিক সন্ধানের জন্য একটি ফাংশন (যেমন getMaxOfDates3, GetMaxOfDates13) এর একটি সেট তৈরি করেছি ইউনিয়ন সমস্ত ব্যবহার করে 13 টি তারিখের মান। একই সারি থেকে সর্বাধিক মান পেতে টি-এসকিউএল ফাংশনটি দেখুন তবে আমি এই ফাংশনগুলি লেখার সময় UNPIVOT সমাধান বিবেচনা করি নি
টেবিলের উপরে কর্মচারীর বেতন সারণি যা বেতন 1, বেতন 2, বেতন 3, বেতন 4 কলাম হিসাবে রয়েছে Qu নীচের বিষয়গুলি চারটি কলামের মধ্যে সর্বাধিক মান প্রদান করবে
select
(select Max(salval) from( values (max(salary1)),(max(salary2)),(max(salary3)),(max(Salary4)))alias(salval)) as largest_val
from EmployeeSalary
উপরে ক্যোয়ারী চালানো বৃহত্তম আউটপুট দেবে (10001)
উপরোক্ত প্রশ্নের যুক্তি নীচে হিসাবে রয়েছে:
select Max(salvalue) from(values (10001),(5098),(6070),(7500))alias(salvalue)
আউটপুট হবে 10001
এখানে একটি ভাল সমাধান:
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
আমি জানি না এটি এসকিউএল ইত্যাদিতে আছে কিনা ... এম $ অ্যাকসেস সহায়তায় এমন একটি ফাংশন রয়েছে যা MAXA(Value1;Value2;...)
এরকম করার কথা।
আশা কাউকে সাহায্য করতে পারে।
পিডি: মানগুলি কলাম বা গণনাযুক্ত ইত্যাদি হতে পারে etc.
MAXA
অ্যাক্সেস নয়, একটি এক্সেল ফাংশন ।
WHEN Date1 > Date2 AND Date1 > Date3 THEN Date1; WHEN Date2 > Date3 THEN Date3; ELSE Date3
?