View Full Version : مقایسه رکورد جاری با رکوردهای قبلی و بعدی
saeed6162
چهارشنبه 02 مرداد 1392, 14:13 عصر
سلام دوستان خسته نباشید
یه جدول دارم که دو تا فیلد داره ، اولی توش یکسری اعداد تصادفی کوچکتر از 100 هست و دومی فیلد Flag هست.
قصد دارم که فیلد Flag رکوردهایی رو که 3 ردیف بالا و 3 ردیف پایینش دارای مقدار برابر با هم هستند و رکورد موردنظر با اون 6 تا مساوی نیست رو برابر با True کنم
مثلاً در مثال زیر Flag رکورد ردیف 4 باید True بشه
1----91----false
2----91----false
3----91----false
4----12----true
5----91----false
6----91----false
7----91----false
چطوری انجام بدم؟
محمد سلیم آبادی
چهارشنبه 02 مرداد 1392, 14:48 عصر
سلام،
سوال 1: شما سه فیلد دارید، پس چگونه است که می گویید جدول من از دو فیلد تشکیل شده؟ منظور فیلدی است که ترتیب سطرها را مشخص میکند اولین ستون از راست در مثالی که زدین.
سوال 2: از چه نسخه از SQL Server استفاده می کنید؟
سوال 3: داده های آن ستونی که ترتیب عقب و جلو بودن سطر ها را مشخص می کند همیشه پشت سرهم هستند؟ یعنی 1-2-3-4 یا ممکن است بین این ها فاصله (gap) وجود داشته باشه مثل 1-2-5-6 ؟
saeed6162
چهارشنبه 02 مرداد 1392, 15:41 عصر
سوال 1: شما سه فیلد دارید، پس چگونه است که می گویید جدول من از دو فیلد تشکیل شده؟ منظور فیلدی است که ترتیب سطرها را مشخص میکند اولین ستون از راست در مثالی که زدین.
در اصل 2 فیلد وجود دارد اما برای نشان دادن ردیف فقط در مثال این ستون را اضافه کردم، فرض بفرمائید 3 فیلد داریم.
سوال 2: از چه نسخه از SQL Server استفاده می کنید؟
2012
سوال 3: داده های آن ستونی که ترتیب عقب و جلو بودن سطر ها را مشخص می کند همیشه پشت سرهم هستند؟ یعنی 1-2-3-4 یا ممکن است بین این ها فاصله (gap) وجود داشته باشه مثل 1-2-5-6 ؟
مهم نیست. اگر فرض می کنید گپ وجود دارد مرتب سازی را بر اساس ردیف در نظر بگیرید در غیر اینصورت هم که باز بر اساس ردیف مرتب در نظر بگیرید.
محمد سلیم آبادی
چهارشنبه 02 مرداد 1392, 15:55 عصر
در اصل 2 فیلد وجود دارد اما برای نشان دادن ردیف فقط در مثال این ستون را اضافه کردم، فرض بفرمائید 3 فیلد داریم.
اگر دو فیلد دارید بر چه اساسی سطر قبلی و بعدی را تعیین می کنید؟
saeed6162
چهارشنبه 02 مرداد 1392, 16:09 عصر
اگر دو فیلد دارید بر چه اساسی سطر قبلی و بعدی را تعیین می کنید؟
طبق نمایشی که در کوئری دستور select به من نمایش می ده، اولین داده ای که وارد شده به عنوان اولین سطر نشون داده میشه، حالا از این حرفا بگذریم
گفتم که اصلا 3 تا فیلد داریم.
محمد سلیم آبادی
چهارشنبه 02 مرداد 1392, 17:08 عصر
یه متغیر جدولی به نام table ایجاد کردم که داده های مثال شما را در آن درج کرده سپس دستور update را نوشته و خروجی را بنظر شما رساندم:
declare @table table (row_id int, value int, flag bit null)
insert @table
values (1, 91, 0),
(2, 91, 0),
(3, 91, 0),
(4, 12, 0),
(5, 91, 0),
(6, 91, 0),
(7, 91, 0);
update t
set flag = 1
from @table t
join @table a1 on t.row_id = a1.row_id + 1
join @table a2 on t.row_id = a2.row_id + 2
join @table a3 on t.row_id = a3.row_id + 3
join @table b1 on t.row_id = b1.row_id - 1
join @table b2 on t.row_id = b2.row_id - 2
join @table b3 on t.row_id = b3.row_id - 3
where a1.value = a2.value and a2.value = a3.value and a3.value = b1.value and b1.value = b2.value and b2.value = b3.value and t.value <> a1.value
select row_id, value, iif(flag=1, 'True', 'False') as Flag from @table
/*
row_id value Flag
----------- ----------- -----
1 91 False
2 91 False
3 91 False
4 12 True
5 91 False
6 91 False
7 91 False
*/
saeed6162
شنبه 05 مرداد 1392, 09:52 صبح
خیلی ممنون
اگه امکانش هست توضیح مختصری راجع به این سطر بدید:
join @table a1 on t.row_id = a1.row_id + 1
محمد سلیم آبادی
شنبه 05 مرداد 1392, 14:23 عصر
سطر جاری را با یک سطر قبل پیوند/اتصال می دهد همین.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.