שאלה,

שאלה,

יש לי טבלה, בה אחד השדות מכיל ערך נומרי שאני מתייחס אליו כאילו הוא ממוין בסדר יורד. בהיתיחס למיון הטבלה לפי השדה הנ"ל, הייתי רוצה, לקבל רשימה של 20 שורות, המתחילה מהמקום ה80 עד המקום ה100 (המספרים הם רק לשם הדוגמא), כלומר: אם יש לי בטבלה 200 שורות בהן הערך בשדה הנ"ל מתחיל מ-200 ויורד ל-1, הייתי רוצה לקבל את כל השורות בהן הערך בשדה הנ"ל הוא בין 120-100. ההנחה היא כאמור, שהטבלה ממוינת בסדר יורד מ-200 ל-1, והמקום ה80 (81 ליתר דיוק) = ערך-120 (20 שורות = 100-120, וליתר דיוק 101-120). לא ניתן להניח שאלו הם הערכים האמיתיים בשדה. ניתן רק להשתמש בערכים 20 (לציון מספר השורות) ו-80 לציון המקום (!) של תחילת החבילה. תודה מראש על העזרה שמוליק
 

yaron881

New member
אם אני מבין נכון אתה צריך למשל את

20 הערכים הראשונים (או האחרונים, תלוי איך אתה ממיין). מה שאתה צריך לעשות זה שאילתה שמתחילה כך
select top 20 field1,field2.... from tbl1 order by field1 desc​
לחילופין את יכול להחליף את top 20 ב- top 20 percent לקבלת 20% עליונים
 

ariel10

New member
שאילתה ערכים

כמו שקודמי כתב אולי תעשה את זה בשני שלבים שלב א תמצא מהם ה 20 הערכים העליונים וזה ע"י ההגדרה בשאילתה של top value. ואז בשאילתה הבאה תחבראת השאילתה הרגילה לשאילתה הזו ותראה את הרשומות הבאות אחרי הרשומות האלה שהשדה המחבר הוא NULL בצד של השאילתה הראשונה. וכתוצאה מכך הוא יביא את ה80 הרשומות הראשונות אבל שהם אחרי ה20 הראשונות
 
תודה לשניכם,

אכן זאת כוונתי, אבל לא הבנתי את תשובתך, אריאל ("השדה המחבר הוא NULL"?). א. אם אני מביא את 20 השורות הראשונות, ואני יודע את הערך הקטן מבינהן (בשדה המדובר), אני מניח שכדיי להביא את 80 השורות הבאות, אני יכול לכתוב משהו כמו: select top 80 * from tbl1 where Ind_Field < lowestval כאשר lowestval הוא אותו ערך שציינתי למעלה, נכון ? (אני מקווה
) ב. האם אפשר לעשות את זה בפעולת SQL יחידה (בלא צורך לגשת לDB פעמיים - פעולת SQL מקוננת או משהו ?). ההנחה היא שאין לי צורך ב20 הראשנות, ולכן אני לא רוצה בכלל להביא אותן. המטרה שלי היא לקבל את 80 השורות הנוספות, מבלי להביא תחילה את 20 השורות הראשונות. אז אמממ ... אפשר ? שוב תודה רבה על העזרה, שמוליק
 
אגב, גם תכנון אחר של הטבלה,

שיוכל לעזור לי בביצוע של הפעולה הנ"ל, יתקבל בברכה, רק שלא ניתן להשתמש באינקס רץ, מכיוון שסדר השורות משתנה עם הזמן. ניתן "לחיות" עם שינוי ערך באותה השורה שמקומה משתנה (אם זה תורם לתכנון התומך בפיתרון שדרוש לי) - לא הייתי רוצה לעדכן מחדש את המיספור לכל השורות בטבלה, בכל פעם שאני משנה את מיקומה של שורה ספציפית. עם זאת, כאמור, שינוי נתון מסוים בשורה הספציפית שמיקומה משתנה, מתקבל על הדעת (עם זה עוזר בפיתרון כמובן. כשאני חושב על זה, המודל שדרוש לי, מאד דומה לפורום של תפוז, בו לחיצה על לינק של דף קודם, מביאה לי אוטומטית את X ההודעות הבאות. אולי משהו שמתוכנן באופן דומה ? תודה מראש, שמוליק
 

רון84

New member
שני פתרונות עולים לי בראש

הראשון - שאילתה מקוננת. נניח לשם הדוגמה שהטבלה שלך היא Table והשדה שאתה רוצה הוא ID.
SELECT TOP 20 ID FROM (SELECT TOP 80 ID FROM Table ORDER BY ID Desc) ORDER BY ID Asc​
פתרון אחר, והוא פשוט יותר אך בזבזני יותר - הוא להשתמש בטבלת עזר ע"מ לצרף את מספר השורה באופן זמני לטבלה שלך - ואז לרשום משהו כמו
WHERE RowNum BETWEEN 20 AND 100​
רון
 
יפה !!!

אהבתי את הפתרון שמשתמש ב Asc, Desc - אני חושב שהוא פותר לי את הבעיה, אם כי נראה שהשרת יעבוד דיי קשה (למשל להביא 80 רשומות מהמקום ה 20000). את הפתרון השני לא כל כך הבנתי. איך אתה מתכוון לעדכן את טבלת העזר כל פעם שמשתנה מיקומה של שורה ספציפית ? (עד כמה שאני מבין, יש צורך למספר מחדש את כל הטבלה). תודה תודה, שמוליק
 

רון84

New member
בקשר לטבלת העזר

אם יש לך כמות מאסיבית של רשומות - הפתרון הזה קצת רע. הכוונה שלי הייתה ליצור את הטבלה כל פעם שאתה קורא לשאילתה. משהו כמו
CREATE TABLE #RowNumber(RowNum int IDENTITY(1,1), ID int) INSERT INTO #RowNumber(ID) SELECT ID FROM Table SELECT T0.RowNum, T1.ID FROM #RowNumber T0 INNER JOIN Table T1 ON T0.ID=T1.ID ORDER BY T0.RowNum​
אבל זה כל-כך בזבזני שאני לוקח את הפתרון הזה בחזרה. רון
 

ariel10

New member
הפיתרון שלי

אני לא יודע אם זה הפיתרון הטוב ביותר אבל הוא עובד מצב קובץ עם רשימת תלמידים שאילתה 1 מביאה את ה 25 הראשונים לפי סדר א-ב שאילתה 2 מביאה את ה80 הבאים לאחר ה 25 הראשונים
 
לא הצלחתי לפתוח את הקובץ.

אם תוכל לתת מבנה טבלה ומשפטי SQL מתאמים, זה יהיה אחלה. תודה, שמוליק
 
למעלה