में प्रति समूह अंतिम रिकॉर्ड कैसे प्राप्त करें मुझे एक दिलचस्प समस्या का सामना करना पड़ रहा है। मेरे पास निम्न संरचना वाला एक टेबल है:SQL
CREATE TABLE [dbo].[Event]
(
Id int IDENTITY(1,1) NOT NULL,
ApplicationId nvarchar(32) NOT NULL,
Name nvarchar(128) NOT NULL,
Description nvarchar(256) NULL,
Date nvarchar(16) NOT NULL,
Time nvarchar(16) NOT NULL,
EventType nvarchar(16) NOT NULL,
CONSTRAINT Event_PK PRIMARY KEY CLUSTERED (Id) WITH (
PAD_INDEX = OFF,
STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON
)
)
तो मुद्दा यह है कि मुझे यह डेटा ग्रिड में प्रदर्शित करना है। दो आवश्यकताएं हैं। सबसे पहले सभी घटनाओं को प्रदर्शित करना है चाहे उन्हें किस एप्लिकेशन ने फेंक दिया हो। यह आसान है - एक चयन कथन बहुत आसानी से काम करेगा।
दूसरी आवश्यकता Application
द्वारा घटनाओं को समूहबद्ध करने में सक्षम होना है। दूसरे शब्दों में सभी घटनाओं को इस तरह प्रदर्शित करें कि यदि ApplicationId
एक से अधिक बार दोहराया जाता है, तो प्रत्येक एप्लिकेशन के लिए केवल अंतिम प्रविष्टि लें। इस बिंदु पर ईवेंट (आईडी) की प्राथमिक कुंजी अब इस क्वेरी/दृश्य में आवश्यक नहीं है।
आप यह भी नोटिस कर सकते हैं कि ईवेंट दिनांक और समय स्ट्रिंग प्रारूप में हैं। यह ठीक है क्योंकि वे मानक दिनांक समय प्रारूपों का पालन करते हैं: मिमी/डीडी/yyyy और एचएच: मिमी: एसएस। मैं उन के रूप में निम्नानुसार खींच कर सकते हैं:
Convert(DateTime, (Date + ' ' + Time)) AS 'TimeStamp'
मेरे मुद्दा यह है कि अगर मैं शेष कॉलम पर समग्र कार्यों का उपयोग मैं नहीं जानता कि उनका व्यवहार होता है:
SELECT
ApplicationId,
MAX(Name),
MAX(Description),
MAX(CONVERT(DateTime, (Date + ' ' + Time))) AS 'TimeStamp',
MAX(EventType)
FROM
Event
GROUP BY
ApplicationId
कारण मैं कर रहा हूँ ऐसा करने में संकोच करना इसलिए है क्योंकि MAX
जैसे फ़ंक्शन रिकॉर्ड के एक (उप) सेट से दिए गए कॉलम के लिए सबसे बड़ा मान वापस कर देगा। यह आवश्यक रिकॉर्ड खींचने के लिए आवश्यक नहीं है!
प्रति आवेदन आधार पर केवल अंतिम रिकॉर्ड का चयन करने के तरीके पर कोई विचार?
विंडोिंग फ़ंक्शन का उपयोग करें (ओरेकल में, इसलिए row_number() से अधिक (विभाजन द्वारा ...), AFAIK SQL सर्वर की समान कार्यक्षमता है। –