উত্তর:
SELECT
columns
FROM
(
SELECT TOP 200
columns
FROM
My_Table
ORDER BY
a_column DESC
) SQ
ORDER BY
a_column ASC
এটি অপ্রয়োজনীয়। আপনি একটি ব্যবহার করতে পারেন ORDER BY
এবং DESC
একই প্রভাবটি পেতে কেবল বাছাই করতে পারেন।
দুঃখিত, তবে আমি মনে করি না আমি আমার মতে কোনও সঠিক উত্তর দেখতে পাচ্ছি।
TOP
এক্স শো অনির্ধারিত অনুক্রমে রেকর্ড কাজ করে। যে সংজ্ঞা থেকে একটি BOTTOM
ফাংশন সংজ্ঞায়িত করা যায় না যে অনুসরণ করে ।
যে কোনও সূচক বা বাছাই আদেশের বাইরে। যখন আপনি একটি করেন ORDER BY y DESC
আপনি সর্বাধিক y মান সহ সারিগুলি পান। যদি এটি একটি স্বয়ংক্রিয় জেনারেটেড আইডি হয় তবে এটি অন্য উত্তরে প্রস্তাবিত হিসাবে টেবিলে সর্বশেষ যুক্ত রেকর্ডগুলি প্রদর্শন করা উচিত। যাহোক:
TOP
ফাংশনটির সাথে তুলনা করেন তবে এটির একটি উল্লেখযোগ্য পারফরম্যান্স প্রভাব রয়েছেসঠিক উত্তরটি এমন হওয়া উচিত যে TOP
নীচের সারিগুলি পাওয়ার জন্য সমতুল্য নেই, এবং হতে পারে না ।
কথাটি,
BOTTOM (x) is all the records except TOP (n - x), where n is the count; x <= n
উদাহরণস্বরূপ কর্মচারী থেকে নীচে 1000 নির্বাচন করুন:
টি-এসকিউএল এ,
DECLARE
@bottom int,
@count int
SET @bottom = 1000
SET @count = (select COUNT(*) from Employee)
select * from Employee emp where emp.EmployeeID not in
(
SELECT TOP (@count-@bottom) Employee.EmployeeID FROM Employee
)
এটি দেখে মনে হবে যে সমাধানের অর্ডার বা আদেশের অধীনে যে উত্তরগুলি প্রয়োগ করেছে সেগুলির যে কোনও উত্তরই পয়েন্টটি হারিয়েছে, বা টপ আপনাকে কী বলে তা আসলে বুঝতে পারে না।
শীর্ষস্থানীয় একটি নিরক্ষিত ক্যোয়ারী ফলাফল সেট প্রদান করে যা প্রথম এন রেকর্ডসকে রেকর্ড সেটটি সীমাবদ্ধ করে। (ওরাকল দৃষ্টিকোণ থেকে, এটি যেখানে রাউনুম <(এন + 1) যুক্ত করা সমান।
অর্ডার ব্যবহার করে এমন যে কোনও সমাধান, সারিগুলি ফিরিয়ে আনতে পারে যা শীর্ষস্থানীয় ধারা দ্বারাও ফিরে আসে (যেহেতু ডেটা সেটটি প্রথম স্থানে আনর্ডার্ড করা হয়েছিল), ক্রমে কী মানদণ্ড ব্যবহৃত হয়েছিল তার উপর নির্ভর করে
শীর্ষের কার্যকারিতা হ'ল একবার ডেটাসেটটি একটি নির্দিষ্ট আকার এন এ পৌঁছে যায়, এটি সারিগুলি আনা বন্ধ করে দেয়। এগুলি সমস্ত এনে না নিয়ে ডেটা দেখতে কেমন লাগে তার জন্য আপনি একটি অনুভূতি পেতে পারেন।
বটমটি সঠিকভাবে প্রয়োগ করতে, এটি সম্পূর্ণ ডেটাসেটটি আনর্ডারড করে আনতে হবে এবং তারপরে ডেটাসেটকে চূড়ান্ত এন রেকর্ডে সীমাবদ্ধ করতে হবে। যদি আপনি বিশাল টেবিলগুলি নিয়ে কাজ করে থাকেন তবে এটি বিশেষভাবে কার্যকর হবে না। বা আপনি যা চাইছেন তা অগত্যা তা আপনাকে দেবে না । ডেটা সেটটির শেষে অগত্যা "শেষ সারিগুলি inোকানো" নাও হতে পারে (এবং সম্ভবত বেশিরভাগ ডিএমএল নিবিড় অ্যাপ্লিকেশনগুলির জন্য হবে না)।
একইভাবে, যে সমাধানগুলি অর্ডার দ্বারা বাস্তবায়ন করে সেগুলি হ'ল দুর্ভাগ্যক্রমে, বড় ডেটা সেটগুলির সাথে কাজ করার সময় সম্ভাব্য বিপর্যয়কর। যদি আমার কাছে বলুন, 10 বিলিয়ন রেকর্ড রয়েছে এবং সর্বশেষ 10 চান তবে এটি 10 বিলিয়ন রেকর্ড অর্ডার করা এবং শেষ 10 নির্বাচন করা যথেষ্ট বোকামি।
এখানে সমস্যাটি হ'ল, বটটমের সাথে টপ এর সাথে তুলনা করার সময় আমরা যে অর্থটি মনে করি তার অর্থ হয় না ।
যখন রেকর্ডগুলি সন্নিবেশ করা হয়, মুছে ফেলা হয়, সন্নিবেশ করা হয়, বার বার বার বার মুছে ফেলা হয় তখন কিছু ফাঁক সঞ্চয়স্থানে উপস্থিত হবে এবং পরে যদি সম্ভব হয় তবে সারিগুলি স্লট করা হবে। তবে আমরা প্রায়শই যা দেখি, যখন আমরা শীর্ষ নির্বাচন করি, তখন তা বাছাই করা ডেটা বলে মনে হয়, কারণ এটি টেবিলের অস্তিত্বের প্রথম দিকে haveোকানো হয়েছিল। যদি টেবিলটি অনেকগুলি মোছার অভিজ্ঞতা না দেয় তবে এটি উপস্থিত হতে পারে আদেশ করা হবে। (উদাহরণস্বরূপ সৃষ্টির তারিখগুলি টেবিল তৈরির সময় হিসাবে অনেক পিছনে হতে পারে)। তবে বাস্তবতাটি হ'ল, এটি যদি মুছে ফেলা ভারী টেবিল হয় তবে শীর্ষ এন সারিগুলি এটিকে দেখতে মোটেও তেমন লাগবে না।
সুতরাং - এখানে নীচের লাইনটি (পাং উদ্দেশ্যযুক্ত) হ'ল যে কেউ বটম এন রেকর্ডের জন্য জিজ্ঞাসা করছে তারা আসলে কী জানতে চাইছে তা জানে না। বা, কমপক্ষে, তারা কী জন্য জিজ্ঞাসা করছে এবং বটটম আসলে কী বোঝায় তা একই জিনিস নয়।
সুতরাং - সমাধানটি অনুরোধকারকের আসল ব্যবসায়ের প্রয়োজন মেটাতে পারে ... তবে বটম হওয়ার মানদণ্ডটি পূরণ করে না।
insert
একটি বড়, আনইনডেক্স টেবিলে সারি রাখার জন্য একটি বড় বক্তব্য চালিয়েছি। (আমি সূচিকাগুলি শুরু করার আগে আমি প্রথম টেবিলটি পপুলেট করছি)) রিবুট বা যে কোনও কারণে আমি আমার ক্লায়েন্ট সেশনটি হারিয়েছি এবং এখন আমার নতুন যুক্ত হওয়া সারিগুলি সেখানে আছে কিনা তা দেখতে চাই। যদি টেবিলের 'নীচে' সারিটি আমার সাম্প্রতিকতমগুলির মধ্যে একটি হয় তবে আমি জানি অপারেশনটি সম্পন্ন হয়েছে। 'নীচের' সারিটি যদি অন্য কিছু হয় তবে গ্যারান্টি নেই এবং নিশ্চিত করার জন্য আমাকে পুরো টেবিলটি স্ক্যান করতে হবে ... তবে সম্ভবত 'তলদেশ' পরীক্ষা করে কিছুটা সময় সাশ্রয় করতে পারব ঠিক তেমন ' শীর্ষ '।
"জাস্টিন ইথিয়ার" দ্বারা বর্তমানে গৃহীত উত্তরটি "প্রোটেক্টর একজন" দ্বারা নির্দেশিত সঠিক উত্তর নয়।
যতদূর আমি দেখতে পাচ্ছি, এখন অবধি, অন্য কোনও উত্তর বা মন্তব্য প্রশ্নকার লেখকের কাছে জিজ্ঞাসা করা BOTTOM (x) এর সমতুল্য সরবরাহ করে না।
প্রথমে আসুন একটি দৃশ্য বিবেচনা করুন যেখানে এই কার্যকারিতাটির প্রয়োজন হবে:
SELECT * FROM Split('apple,orange,banana,apple,lime',',')
এটি একটি কলাম এবং পাঁচটি রেকর্ডের একটি সারণী প্রদান করে:
আপনি দেখতে পাচ্ছেন: আমাদের আইডি কলাম নেই; আমরা ফিরে আসা কলাম দ্বারা অর্ডার করতে পারি না; এবং আমরা স্ট্যান্ডার্ড এসকিউএল ব্যবহার করে নীচের দুটি রেকর্ড নির্বাচন করতে পারি না যেমন আমরা শীর্ষ দুটি রেকর্ডের জন্য করতে পারি।
সমাধান দেওয়ার জন্য আমার চেষ্টাটি এখানে:
SELECT * INTO #mytemptable FROM Split('apple,orange,banana,apple,lime',',')
ALTER TABLE #mytemptable ADD tempID INT IDENTITY
SELECT TOP 2 * FROM #mytemptable ORDER BY tempID DESC
DROP TABLE #mytemptable
এবং এখানে আরও একটি সম্পূর্ণ সমাধান:
SELECT * INTO #mytemptable FROM Split('apple,orange,banana,apple,lime',',')
ALTER TABLE #mytemptable ADD tempID INT IDENTITY
DELETE FROM #mytemptable WHERE tempID <= ((SELECT COUNT(*) FROM #mytemptable) - 2)
ALTER TABLE #mytemptable DROP COLUMN tempID
SELECT * FROM #mytemptable
DROP TABLE #mytemptable
আমি দাবী করি না যে সমস্ত পরিস্থিতিতে এটি ব্যবহার করা ভাল ধারণা, তবে এটি পছন্দসই ফলাফল সরবরাহ করে।
আপনার যা করতে হবে তা হ'ল আপনার বিপরীত ORDER BY
। DESC
এটিতে যুক্ত বা সরিয়ে দিন।
অন্যভাবে অর্ডার দেওয়ার সমস্যাটি হ'ল এটি প্রায়শই সূচকের ভাল ব্যবহার করে না। আপনার যদি কখনও শুরু এবং শেষ না হয় এমন অনেকগুলি সারি নির্বাচন করার প্রয়োজন হয় তবে এটি খুব বেশি প্রসারণযোগ্যও নয়। একটি বিকল্প উপায় নিম্নরূপ:
DECLARE @NumberOfRows int;
SET @NumberOfRows = (SELECT COUNT(*) FROM TheTable);
SELECT col1, col2,...
FROM (
SELECT col1, col2,..., ROW_NUMBER() OVER (ORDER BY col1) AS intRow
FROM TheTable
) AS T
WHERE intRow > @NumberOfRows - 20;
উপরের "টম এইচ" উত্তরটি সঠিক এবং এটি নীচে 5 টি সারি পাওয়ার জন্য আমার পক্ষে কাজ করে।
SELECT [KeyCol1], [KeyCol2], [Col3]
FROM
(SELECT TOP 5 [KeyCol1],
[KeyCol2],
[Col3]
FROM [dbo].[table_name]
ORDER BY [KeyCol1],[KeyCol2] DESC) SOME_ALAIS
ORDER BY [KeyCol1],[KeyCol2] ASC
ধন্যবাদ।
এটা চেষ্টা কর.
declare @floor int --this is the offset from the bottom, the number of results to exclude
declare @resultLimit int --the number of results actually retrieved for use
declare @total int --just adds them up, the total number of results fetched initially
--following is for gathering top 60 results total, then getting rid of top 50. We only keep the last 10
set @floor = 50
set @resultLimit = 10
set @total = @floor + @resultLimit
declare @tmp0 table(
--table body
)
declare @tmp1 table(
--table body
)
--this line will drop the wanted results from whatever table we're selecting from
insert into @tmp0
select Top @total --what to select (the where, from, etc)
--using floor, insert the part we don't want into the second tmp table
insert into @tmp1
select top @floor * from @tmp0
--using select except, exclude top x results from the query
select * from @tmp0
except
select * from @tmp1
আমি এটির একটি সমাধান নিয়ে এসেছি যার জন্য আপনাকে ফিরে আসা সারির সংখ্যাটি জানতে হবে না।
উদাহরণস্বরূপ, আপনি যদি সর্বশেষ 1 (বা 2, বা 5, বা 34) ব্যতীত কোনও সারণীতে লগইন করা সমস্ত অবস্থান পেতে চান
SELECT *
FROM
(SELECT ROW_NUMBER() OVER (ORDER BY CreatedDate) AS Row, *
FROM Locations
WHERE UserId = 12345) AS SubQuery
WHERE Row > 1 -- or 2, or 5, or 34
SELECT TOP 10*from TABLE1 ORDER BY ID DESC
যেখানে আইডিটি ট্যাবলেট 1 এর প্রাথমিক কী।
প্রথমে টেবিলের মূল ক্রম অনুসারে একটি সাবকিউরিতে একটি সূচক তৈরি করুন:
ROW_NUMBER () OVER (ORDER BY (SELECT NULL) ) AS RowIndex
তারপরে RowIndex
আপনি মুখ্য ক্যোয়ারিতে তৈরি কলামটি দিয়ে টেবিলটিকে অবতরণ করুন :
ORDER BY RowIndex DESC
এবং অবশেষে TOP
আপনার প্রয়োজনীয় পরিমাণে সারি ব্যবহার করুন:
SELECT TOP 1 * --(or 2, or 5, or 34)
FROM (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL) ) AS RowIndex, *
FROM MyTable) AS SubQuery
ORDER BY RowIndex DESC