הוספת sequence לעמודה עם תנאים

maze82

New member
הוספת sequence לעמודה עם תנאים

שלום לכולם,
תודה מראש לעונים.

יש לי טבלה עם 4 עמודות: (table(A,B,C, D
הבעיה: אני צריך להוסיף sequence שמתחיל מ 1 לעמודה C רק איפה שיש לי דופליקציות עבור שלושת העמודות הראשונות
(group by A,B,C having count(*) > 1).

בנוסף sequence צריך להתחיל מה - D הכי גדול (order by by D desc).
ה- sequence מתאפס (ל-1) עבור כל A,B,C ייחודי.


כלומר עבור הטבלה הבאה:

A B C D
1 1 X 10
1 1 X 20
2 2 Y 2
2 2 Y 1
3 3 Z 7

אני אצפה לקבל את הטבלה:

A B C D
1 1 X_2 10
1 1 X_1 20
2 2 Y_1 2
2 2 Y_2 1
3 3 Z 7



מקווה שהבהרתי את עצמי בצורה סבירה :)
 

גרי רשף

New member
הצלחתי להבין


השליפה הבסיסית עם המספור ועם ספירת השורות בכל צירוף:
Select Row_Number() Over(Partition By A,B,C Order By D Desc) N,
Count(1) Over(Partition By A,B,C) Cnt,
*
From MyTbl;

ומקווה שזה מה שחיפשת עם השירשור המותנה של המספר ל-D:
Select *
Case When Count(1) Over(Partition By A,B,C)<=1 Then D
Else D+'_'+Cast(Row_Number() Over(Partition By A,B,C Order By D Desc) As Varchar)
End D1
From MyTbl;
 

maze82

New member
צריך משהו דומה...

תודה על התשובה.
הכוונה שלי הייתה איך אני עושה UPDATE לטבלה והופך אותה ללא לייחודית עבור שלשושת המפתחות.
כלומר הייתי רוצה לעשות משהו כזה (קוד לא חוקי):

update MyTable set D= D ||'_'|| rownum
group by A,B,C
order by D

הבעיה שלי זה איך אני מאפס ל - 1 עבור כל A,B,C ייחודי (ורק כאלו שמופיעים יותר מפעם אחת )

תודה.
 

pitoach

New member
תצרף לנו DDL+DML בבקשה ותחסוך לנו עבודה

שחורה סתם
תן לנו להתרכז בעזרה שאתה צריך
 

גרי רשף

New member
כיוונים לפתרונות

1. לדעתי לא ניתן ליצור איזה סוג של Identity או Sequence שיעשה זאת בעצמו.

2. לא ניתן ליצור עמודה מחושבת שתכלול ביטוי כמו בעמודה D1 בדוגמה שלי בגלל השימוש בפונקציות חלון.

3. ניתן ליצור עמודה לא מחושבת שתתעדכן סינכרונית על ידי טריגר או אסינכרונית על ידי תהליך שירוץ אחת לכמה זמן (פעם ביום? פעם בשעה? פעם בחודש לפני הפקת הדוחות?..).
ה- update די דומה ל-Select עם ההבדלים המתבקשים (יש צורך לפרט?).

4. ניתן ליצור View שיכלול את החישוב של D1, ולפנות בעת הצורך אליו ולא לטבלה.
 
למעלה