SQL "with AS" طريقة بديلة
سؤال
في سؤال سابق ، ساعدتني يا رفاق في الحصول على بيانات من صف مختلف. البيان الذي أستخدمه يعمل تمامًا على استوديو MS SQL Server Managment Studio. يمكنني تشغيل البيان دون أي أخطاء وأرجع البيانات التي أحتاجها. ومع ذلك ، أحتاج إلى تشغيل هذه البيانات على برنامج الواجهة الأمامية لدينا. عندما أحاول تشغيل بياني في هذا البرنامج ، فإنه معلق فقط. لدي شعور بأن جزء "مع" من هذا البيان يسبب مشاكل. هل هناك على أي حال لإعادة كتابة هذا البيان عن طريق وضع هذا الجدول المؤقت في مسمة فرعية؟
WITH Temp1 AS (SELECT
SkillTargetID = Agent_Logout.SkillTargetID,
LogoutDateTime = Agent_Logout.LogoutDateTime,
LogonDate = DateAdd(s,-1 * Agent_Logout.LoginDuration,Agent_Logout.LogoutDateTime),
ROW_NUMBER() OVER(PARTITION BY Agent_Logout.SkillTargetID ORDER BY Agent_Logout.LogoutDateTime ASC) RowVersion,
LoginDuration = Agent_Logout.LoginDuration
FROM Agent_Logout)
SELECT
AgentID = Base.SkillTargetID,
LogonDate = Base.LogonDate,
BaseLogout = Base.LogoutDateTime,
BaseDuration = Base.LoginDuration,
NextLogon = Temp1.LogonDate,
LogoutDuration = DateDiff(s,Base.LogoutDateTime,Temp1.LogonDate)
FROM Temp1 Base
LEFT JOIN Temp1 ON Base.SkillTargetID = Temp1.SkillTargetID
AND Base.RowVersion = Temp1.RowVersion-1
المحلول 2
أدناه هو ما انتهى بي. هذا يعمل مع برنامج Cisco Front-end الذي نستخدمه.
DECLARE @dtStartDateTime DATETIME, @dtEndDateTime DATETIME, @agentid VARCHAR
SET @dtStartDateTime = :start_date SET @dtEndDateTime = :end_date
SELECT
FullName = Temp1.FullName,
AgentID = Temp1.SkillTargetID,
LogonDate = Temp1.LogonDate,
LogoutDate = Temp1.LogoutDateTime,
LoginDuration = Temp1.LoginDuration,
RowVersion# = Temp1.RowVersion,
AgentID2 = Temp2.SkillTargetID,
LogonDate2 = Temp2.LogonDate,
LogoutDate2 = Temp2.LogoutDateTime,
RowVersion#2 = Temp2.RowVersion,
LogoutDuration = DateDiff(s,Temp1.LogoutDateTime,Temp2.LogonDate)
FROM
(SELECT
FullName = Person.LastName + ', ' + Person.FirstName,
SkillTargetID = Agent_Logout.SkillTargetID,
LogoutDateTime = Agent_Logout.LogoutDateTime,
LogonDate = DateAdd(s,-1 * Agent_Logout.LoginDuration,Agent_Logout.LogoutDateTime),
ROW_NUMBER() OVER(PARTITION BY Agent_Logout.SkillTargetID ORDER BY Agent_Logout.LogoutDateTime ASC) as RowVersion,
LoginDuration = Agent_Logout.LoginDuration
FROM Agent_Logout, Agent, Person
WHERE Agent_Logout.SkillTargetID = Agent.SkillTargetID and Agent.PersonID = Person.PersonID
) Temp1,
(SELECT
SkillTargetID = Agent_Logout.SkillTargetID,
LogoutDateTime = Agent_Logout.LogoutDateTime,
LogonDate = DateAdd(s,-1 * Agent_Logout.LoginDuration,Agent_Logout.LogoutDateTime),
ROW_NUMBER() OVER(PARTITION BY Agent_Logout.SkillTargetID ORDER BY Agent_Logout.LogoutDateTime ASC) as RowVersion
FROM Agent_Logout
WHERE Agent_Logout.SkillTargetID = Agent_Logout.SkillTargetID
) Temp2
WHERE Temp1.SkillTargetID = Temp2.SkillTargetID and Temp1.RowVersion = (Temp2.RowVersion - 1) AND
(Temp1.LogonDate >= :start_date
And Temp1.LogonDate <= :end_date) AND
Temp1.SkillTargetID IN (:agentid)
ORDER BY Temp1.SkillTargetID, Temp1.RowVersion
نصائح أخرى
إذا كنت ترغب فقط في تحقيق ذلك يمكنك القيام به
;WITH Temp1 AS (
SELECT
SkillTargetID = Agent_Logout.SkillTargetID,
LogoutDateTime = Agent_Logout.LogoutDateTime,
LogonDate = DateAdd(s,-1 * Agent_Logout.LoginDuration,Agent_Logout.LogoutDateTime),
ROW_NUMBER() OVER(PARTITION BY Agent_Logout.SkillTargetID ORDER BY Agent_Logout.LogoutDateTime ASC) RowVersion,
LoginDuration = Agent_Logout.LoginDuration
FROM Agent_Logout)
SELECT * INTO #Temp1 FROM Temp1
SELECT
AgentID = Base.SkillTargetID,
LogonDate = Base.LogonDate,
BaseLogout = Base.LogoutDateTime,
BaseDuration = Base.LoginDuration,
NextLogon = #Temp1.LogonDate,
LogoutDuration = DateDiff(s,Base.LogoutDateTime,#Temp1.LogonDate)
FROM #Temp1 Base
LEFT JOIN #Temp1 ON Base.SkillTargetID = #Temp1.SkillTargetID
AND Base.RowVersion = #Temp1.RowVersion-1
لا يفهم حقًا ما تعنيه من خلال التعليق عند الجري في برنامج الواجهة الأمامية. هل تستخدم الاستعلام تمامًا كما هو مكتوب أم أنك تقوم بتصويره بطريقة ما؟
هل تقوم بتشغيله مقابل نفس البيانات في كل مرة؟