PDA

View Full Version : مشکل در به کارگیری هم زمان توابع تراکم و توابع ریاضی



nasrin55
دوشنبه 22 شهریور 1389, 09:05 صبح
سلام.
من میخوام select را بنویسم که حین اون نرمال سازی را هم انجام بده با این فرمول:
(field - min) / (max - min)

حالا مشکل اینجاست که ارور میده که باید از group by استفاده کنم ولی من نمیخوام این کارو کنم چون اطلاعاتم نباید تغییر کند.
راهی هست ؟؟؟

Reza_Yarahmadi
دوشنبه 22 شهریور 1389, 09:28 صبح
دقيقا متوجه سوال و مشكلتون نشدم ولي كد زير رو امتحان كنيد ببينيد كارتون رو راه ميندازه يا نه


;with h1 as(select min(id) as MinId,max(id) as MaxId from tbl1)
select MinId, MaxId, Id, ((Id - MinId) / (MaxId - MinId)) from h1,tbl1

nasrin55
دوشنبه 22 شهریور 1389, 09:39 صبح
در این حد هم کارم پیشرفته نیست. ببینید این که فرمول نرمال سازی هست ، درست.
(field - min) / (max - min)

حالا من وقتی این کدها را می نویسم ارور میده :


INSERT INTO bak2.dbo.Tbl_Order
(bak2.dbo.Tbl_Order .orderID,bak2.dbo.Tbl_Order .VariableValue ,bak2.dbo.Tbl_order.idx)
SELECT s.SADFID,
(c.a- min(c.a)) /(max(c.a) - min(c.a)),
fi.idx
from saledraft s inner join
customer c on ( s.sadfcuscod=c.culcod) inner join
bak2.dbo.Tbl_Input fi on( fi.xname like N'%شاخص%')

بهزادصادقی
دوشنبه 22 شهریور 1389, 09:55 صبح
وقتی شما می نویسید:



min(c.a)


این min را می خواهید با احتساب به کدام زیر مجوعه از سطر های جدول customer محاسبه کنید. آیا نظرتان min ستون a نسبت به کل سطرهای این جدول می باشد، و یا آیا منظورتان min این ستون در بین آن سطرهایی می باشد که در inner join های شما در این query شرکت می کنند، یعنی مثلا تمام سطرهایی که ستون culcod شان برابر است با s.sadfcsucod و غیره.

nasrin55
دوشنبه 22 شهریور 1389, 10:17 صبح
منظورم همینه که min ستون a نسبت به کل سطرهای فیلد a جدول customer است.

Reza_Yarahmadi
دوشنبه 22 شهریور 1389, 10:31 صبح
فكر كنم اين كارتون رو راه بندازه
with tbl1 as (
SELECT
min(c.a) as M,
max(c.a) as MM
from customer c)

,tbl2 as(
SELECT
s.SADFID,
(c.a - M) /(MM - M) as Col1,
fi.idx
from saledraft s inner join customer c on ( s.sadfcuscod=c.culcod)
inner join bak2.dbo.Tbl_Input fi on( fi.xname like N'%شاخص%')
inner join tbl1)

INSERT INTO bak2.dbo.Tbl_Order
(bak2.dbo.Tbl_Order .orderID,bak2.dbo.Tbl_Order .VariableValue ,bak2.dbo.Tbl_order.idx)
SELECT * from tbl2

nasrin55
دوشنبه 22 شهریور 1389, 10:41 صبح
اررو میده: syntax near ')' تو خط 14 اینجا میشه.

Reza_Yarahmadi
دوشنبه 22 شهریور 1389, 11:00 صبح
اين يكي ديگه نبايد ارور بده

with tbl1 as (
SELECT
min(c.a) as M,
max(c.a) as MM
from customer c)

,tbl2 as(
SELECT
s.SADFID,
(c.a - M) /(MM - M) as Col1,
fi.idx
from saledraft s inner join customer c on ( s.sadfcuscod=c.culcod)
inner join bak2.dbo.Tbl_Input fi on( fi.xname like N'%شاخص%')
,tbl1)

INSERT INTO bak2.dbo.Tbl_Order
(bak2.dbo.Tbl_Order .orderID,bak2.dbo.Tbl_Order .VariableValue ,bak2.dbo.Tbl_order.idx)
SELECT * from tbl2

nasrin55
دوشنبه 22 شهریور 1389, 11:22 صبح
خیــــــــــلی ممنون. فکر میکنم که تا اینجا درست شده ولی چون داده هام زیاده نمی تونم دستی امتحان کنم.
الان مشکلی که هست اینه که همه ی مقادیر نرمال شده را null گذاشته، میشه گفت به خاطر اینه که بیشتر فیلدها null هستند و تابع min ، مینیمم را همون null می گیره ؟؟؟

Reza_Yarahmadi
دوشنبه 22 شهریور 1389, 11:41 صبح
الان مشکلی که هست اینه که همه ی مقادیر نرمال شده را null گذاشته، میشه گفت به خاطر اینه که بیشتر فیلدها null هستند و تابع min ، مینیمم را همون null می گیره ؟؟؟ به null بودن ربطي نداره و اين 2 تابع مقدار null رو در نظر نميگيرن احتمالا به خاطر دستور Insert باشه
اسم Col1 رو به VariableValue تغيير بديد يا اينكه در دستور Select آخر ، به جاي * اسم تك تك فيلدها رو بنويسيد
اينطوري شايد درست بشه!!

ASKaffash
دوشنبه 22 شهریور 1389, 11:58 صبح
سلام


Declare @Min float,@Max float
Select @Min=Min(a),@Max=Max(a) From T
Select A=(a-@Min)/(@Max-@Min) From T

Reza_Yarahmadi
دوشنبه 22 شهریور 1389, 12:16 عصر
سلام


Declare @Min float,@Max float
Select @Min=Min(a),@Max=Max(a) From T
Select A=(a-@Min)/(@Max-@Min) From T

قبل از اينكه چيزي بگم اين نكته رو ذكر كنم كه قصدم فقط بحث و يادگيري است نه بيشتر.
به نظرتون اين روش بدليل اينكه دوبار عمل جستجو انجام ميشه سربار زيادي نداره؟
دستوري كه بنده نوشتم به دليل استفاده از with (تمامي دستورات يك with بصورت يك جستجو روي بانك اعمال ميشه) فقط يك بار جستجو انجام ميده به نظرتون اين روش بهتر نيست؟

nasrin55
دوشنبه 22 شهریور 1389, 12:26 عصر
به null بودن ربطي نداره و اين 2 تابع مقدار null رو در نظر نميگيرن احتمالا به خاطر دستور Insert باشه
اسم Col1 رو به VariableValue تغيير بديد يا اينكه در دستور Select آخر ، به جاي * اسم تك تك فيلدها رو بنويسيد
اينطوري شايد درست بشه!!


بازم خیلی خیلی ممنون.
با تغییر col1 به variablevalue درست نشد. منظورتون از تک تک فیلدها چیه؟ کدوم فیلدها رو به جای * بنویسم؟؟؟

ASKaffash
دوشنبه 22 شهریور 1389, 12:38 عصر
قبل از اينكه چيزي بگم اين نكته رو ذكر كنم كه قصدم فقط بحث و يادگيري است نه بيشتر.
به نظرتون اين روش بدليل اينكه دوبار عمل جستجو انجام ميشه سربار زيادي نداره؟
دستوري كه بنده نوشتم به دليل استفاده از with (تمامي دستورات يك with بصورت يك جستجو روي بانك اعمال ميشه) فقط يك بار جستجو انجام ميده به نظرتون اين روش بهتر نيست؟
سلام
شما فکر میکنید که روش شما یکبار جدول را پیمایش می کند ؟ به نظرمن نه فکر کن دلیلش را پیدا می کنی

nasrin55
دوشنبه 22 شهریور 1389, 12:48 عصر
میگما... واسه من اصلا اهمیت نداره که چند بار پیمایش کنه....، فقط جواب بده...!!!!!

Reza_Yarahmadi
دوشنبه 22 شهریور 1389, 13:29 عصر
با تغییر col1 به variablevalue درست نشد. منظورتون از تک تک فیلدها چیه؟ کدوم فیلدها رو به جای * بنویسم؟؟؟

INSERT INTO bak2.dbo.Tbl_Order
(bak2.dbo.Tbl_Order .orderID,bak2.dbo.Tbl_Order .VariableValue ,bak2.dbo.Tbl_order.idx)
SELECT SADFID,col1,idx from tbl2

اگر اينطوري هم درست نشه احتمال داره داره توي شرطهاي join باشه چون روي سيستم خودم جواب ميده.

شما فکر میکنید که روش شما یکبار جدول را پیمایش می کند ؟ به نظرمن نه فکر کن دلیلش را پیدا می کنی
در ظاهر به نظر ميرسه كه هر جستجو جداي از جستجوي قبل انجام ميشه چون از نتايج جستجوي قبلي ميشه توي جستجوي بعد استفاده كرد ولي توي مطلبي كه درباره with خوندم (لينكش رو خاطرم نيست) نوشته شده بود كه SQL Server تمامي جستجوهاي with رو بهينه كرده و در غالب يك جستجو روي داده هاي بانك اعمال ميكنه.(من به خاطر همين حرف بود كه ازش خوشم اومده!!)
سعي ميكنم لينكش رو پيدا كنم و خدمتتون ارائه بدم تا نظرتون رو بگيد.

بهزادصادقی
دوشنبه 22 شهریور 1389, 13:29 عصر
خیــــــــــلی ممنون. فکر میکنم که تا اینجا درست شده ولی چون داده هام زیاده نمی تونم دستی امتحان کنم.
الان مشکلی که هست اینه که همه ی مقادیر نرمال شده را null گذاشته، میشه گفت به خاطر اینه که بیشتر فیلدها null هستند و تابع min ، مینیمم را همون null می گیره ؟؟؟

حتی اگر یک سطر وجود داشته باشد که در آن c.a مقدارش null نیست، توابع min و max مقدارشان غیر null خواهد بود. آیا این امکان وجود دارد که تمام سطرهای مورد تست شما مقدار ستون a شان null است؟

از طرف دیگر، هر سطری که در آن ستون a مقدارش null است، خود به خود باعث می شود که مقدار محاسبه شده برای ستون VariableValue هم null باشد.

در ضمن، این هم یک راه دیگر برای به دست آوردن نتیجه ای که دنبالش هستید:



INSERT INTO
bak2.dbo.Tbl_Order
(
orderID,
VariableValue,
idx
)
SELECT
s.SADFID,
(c.a - min(c.a) over()) /(max(c.a) over() - min(c.a) over() ),
fi.idx
from
saledraft s
inner join
customer c
on
s.sadfcuscod = c.culcod
inner join
bak2.dbo.Tbl_Input fi
on
fi.xname like N'%شاخص%';

ASKaffash
سه شنبه 23 شهریور 1389, 08:46 صبح
میگما... واسه من اصلا اهمیت نداره که چند بار پیمایش کنه....، فقط جواب بده...!!!!!
سلام
مگه روشی که ارائه کردم غلط جواب میده ؟

ولی بحث بهینه سازی
اگر روی فیلد a یک ایندکس و جود داشته باشد با هر روشی تقریبا یک بار Table Scan اتفاق می افته ولی در غیر اینصورت به هر روشی نوشته شود اول باید از یک مجموع Min و Max استخراج شود بعد دردستور Select استفاده شود برای اثبات می توان به Execution Plan هم نگاه کرد

nasrin55
سه شنبه 23 شهریور 1389, 13:32 عصر
من همه ی روشها را امتحان کردم نمیدونم چرا همه اش null میداد ولی روش آخری که آقای صادقی گفتند درست جواب داد.
ممنون از همگی :)