USER topilgan bo'lsa, oxirgi qatorni SELECT

SQL Serverda log jadval mavjud. Jadval bu tarzda tuzilgan:

Unique  ProblemID  ResponsibleID  AssignedToID  ProblemCode

155     155        0282                         4
156     155                       0900
157     155                                     3
158     155                       0147          1
159     159        0111                         2
160     159                       0333          4
161     159        0900                         1

Shunday qilib, asosan, barcha muammolarni yozib qo'yamiz va mas'uliyatli va mas'uliyatli shaxs bilan shug'ullanamiz. Bir kishining qanday muammolarga duch kelganini aniqlash uchun so'rov kerak.

Misol uchun:

  1. 0900 ID raqami 155 va 159da ishtirok etgan.
  2. 0282 raqamli shaxs faqatgina 155 ta ishtirok etgan.
  3. 0333 ID raqami faqat 159da ishtirok etdi.

Shuningdek, muammoli kodning so'nggi satrini muammo kodi bilan filtrlash kerakligini eslayman. Misol uchun, shaxsning ishtirok etishi bilan bog'liq muammolarni toping, ammo bu muammoning oxirgi log tizimida muammo kodi 1 (muammo hozir yopilgan degan ma'noni anglatadi).

Bundan tashqari, so'rov bilan ishlay boshladim:

    select ProblemID, EntryTime, ResponsibleID, ProblemCode, AssignedToID
    from (select ProblemID, EntryTime, ResponsibleID, ProblemCode,  AssignedToID,
    row_number() over(partition by ProblemID order by EntryTime desc) as rn
    from myTable) as T
    where rn = 1 and ResponsibleID = '00282' OR AssignedToID = '00282' 
    and veiksmoid <> 4

Biroq, faqatgina oxirgi qatorlarga mos keladi.

3
natijada nima istaysiz?
qo'shib qo'ydi muallif rahularyansharma, manba
Siz istagan narsa oddiy WHERE bandi; ishlamagan ishni nima qildingiz?
qo'shib qo'ydi muallif Kieren Johnstone, manba
oxirgi satr har doim xatoning hozirgi holatini ko'rsatadi.
qo'shib qo'ydi muallif GEMI, manba
Ushbu oddiy so'rovlar juda ko'p sonli satrlarni qaytaradi, men faqatgina Noyob PRO-ID ga ega bo'lishni xohlayman.
qo'shib qo'ydi muallif GEMI, manba
Nima uchun 900 va 155 da, 159da ham muammo yuz berdi
qo'shib qo'ydi muallif sll, manba
Nima uchun oxirgi qatorni tanlash kerak?
qo'shib qo'ydi muallif sll, manba

4 javoblar

SELECT ag.UserId, ag.ProblemID
FROM(
   SELECT ProblemID, ResponsibleID as UserId
   FROM Table 
   WHERE ResponsibleID IS NOT NULL

   UNION ALL

   SELECT ProblemID, AssignedToID  as UserId
   FROM Table 
   WHERE AssignedToID IS NOT NULL
) ag
GROUP BY ag.UserId, ag.ProblemID
1
qo'shib qo'ydi
Muammo kodini ko'rsatishim kerak. Masalan, WHERE ProblemCode <> 4 yoki ProblemCode = 9 va h.k.
qo'shib qo'ydi muallif GEMI, manba
Bu aniq xatolikning so'nggi harakati. Agar 155 xatolik yopilsa, 1 raqami bilan bitta chiziq hosil bo'ladi. Agar xatolik qayta yo'naltirilsa, 9 raqamli chiziq yaratiladi. Shunday qilib, ayrim narsalar bo'yicha dolzarb bo'lish uchun men ushbu oxirgi satrlarni filtrlash imkoniyatiga ega bo'lishim kerak.
qo'shib qo'ydi muallif GEMI, manba
O'ylaymanki, bu ba'zi bir tweaking bilan amalga oshiradi. Bu aniq bir xatoning oxirgi qatorida nima ekanligini bevosita tekshirmasa ham ...
qo'shib qo'ydi muallif GEMI, manba
@GEMI: yep tekshirmaydi, chunki men uchun muammo kodining butun mantiqi aniq emas. Agar siz uni PersonId = 900 misolida aniqlasangiz, u yaxshi ovqatlanishadi
qo'shib qo'ydi muallif sll, manba
Shuning uchun faqatgina ProblemCode = 1 yozuvlari kerak bo'ladi?
qo'shib qo'ydi muallif sll, manba

Bu sizga 0900 kishi bilan bog'liq bo'lgan barcha muammolarni va oxirgi satrda codeCode = 1 ega. Buni tekshirib bo'lmaydi, shuning uchun ba'zi xatolar bo'lishi mumkin.

SELECT problemID FROM <table> t1
WHERE problemID IN  (
      SELECT problemID FROM <table>
      WHERE (ResponsibleID = 0900 OR AssignedToID = 0900))
AND problemCode = 1
AND unique = (SELECT MAX(unique) FROM <table> WHERE problemID = t1.problemID)
1
qo'shib qo'ydi
Buni yaxshi qabul qilinmaguncha qabul qilaman.
qo'shib qo'ydi muallif GEMI, manba
Bu juda yaxshi ko'rinadi, harakat qilish uchun tashakkur, lekin bu MSSQL uchun ishonch hosil qilsangiz, men sintaksik xatolarni noyob deb topaman.
qo'shib qo'ydi muallif GEMI, manba
Oxirgi so'rov bilan bog'liq muammo, raqam 1dan oldin bir nechta satrlarda bo'lishi mumkin ... Faqat muayyan xatolikning oxirgi qatori muhim.
qo'shib qo'ydi muallif GEMI, manba
Ha, bu so'rov kimligini topish uchun yaxshi, ammo oxirgi satrda filtrlashni ilojsiz qiladi. Masalan, oxirgi satrda muammo kodi bo'lgan xatolarni topmoqchi bo'lsam ...
qo'shib qo'ydi muallif GEMI, manba
Bu menga barcha qatorlarni beradi, men faqat yagona muammolarga muhtojman.
qo'shib qo'ydi muallif GEMI, manba
Endi, so'nggi so'rovni sinab ko'rsata olasizmi? Ehtimol, ba'zi optimallashtirish kerak bo'ladi, lekin u sizni bir joyga olib kelishi mumkin.
qo'shib qo'ydi muallif phil, manba
Endi, oxirgi ishni sinab ko'rsata olasizmi? Siz nima qilayotganingizni noto'g'ri tushungan bo'lishi mumkin, chunki bu so'rovga oddiy qo'shimcha.
qo'shib qo'ydi muallif phil, manba
Rostini aytganda, men Oracle dan foydalanmoqdaman, shuning uchun MSSQL sintaksisiga ishonchim komil emas. Biroq, "noyob" siz o'zingizning "OP" ga joylashtirilgan "noyob" maydonni anglatadi. Buning o'rniga to'g'ri ustun nomini o'zgartirish mumkinmi?
qo'shib qo'ydi muallif phil, manba
Iltimos, uchinchi so'rovni ko'rib chiqing
qo'shib qo'ydi muallif phil, manba
SELECT distinct problemid
   from YourTable
   where 
         ( Responsible = 0900
      OR AssignedToID = 0900 )
      AND ProblemCode <> 1
0
qo'shib qo'ydi
Rahmat, bu yaxshi, lekin xatoning so'nggi xatolik kodini hisobga olmaydi.
qo'shib qo'ydi muallif GEMI, manba

Ehtimol, bu so'rov quyidagicha yordam berishi mumkin:

SELECT ProblemID
FROM LOGTABLE
WHERE (ResponsibleID = x) OR (AssignedToID = x)

LOGTABLE - jadvalning nomi va x - shaxsning identifikatori.

0
qo'shib qo'ydi
Bu holatda siz ehtimol x ning (ResponsibleID, AssignedToID) manzilidan foydalanishingiz mumkin
qo'shib qo'ydi muallif abatishchev, manba
IN versiyasidan foydalanish ishlaydi. Lekin men uni ishlatmas edim. Odamlar variable IN (constant, constant) ga ko'proq tanishdir va ushbu versiyani ishlatish hech qanday ishlash foyda bermaydi. Bu noto'g'ri emas, men ham yomon emas, deb o'ylamayman, faqat O'Zdan foydalanish ko'proq tanish deb o'ylayman va shuning uchun afzal ko'rmoqdaman.
qo'shib qo'ydi muallif MatBailie, manba