ورود

View Full Version : دستور group by یا distinct پیشرفته



khadem1386
یک شنبه 15 آبان 1390, 10:45 صبح
حرفه ای:
سلام:
من دارم روی یک پروژه کار می کنم که شبیه وبگذر است و آمار بازدید کننده گان را می گیره

این پروژه تعاریف مختلفی داره مثل . hit clike pageview visitor.

خوب سوال من در رابطه با یک کوئری است که visitor را نشان بده.

ابتدا آمدم بوسیله تنوع ip های دریافتی که توی دیتابیسم در 24 ساعت دریافت می کنم تعداد یا همان تنوع ویزیتور های خودم را بدست آوردم.


SELECT COUNT(distinct ip) AS [Number of visitors]
FROM Table1
where CONVERT(VARCHAR(10),(Date_server), 105) = '3-10-2011'



اما اکنون که بر روی گوگل آنالیزتیک و غیره بررسی کردم متوجه شدم که واژه visitor کمی پیچیده تر از تنوع ip تنها است.

به این ترتیب که بغیر از تنوع ip:
اگر یک ip ثابت، نیم ساعت به نیم ساعت کلیک کنه یعنوان یک یوزر جدید یا همان visitor جدید شناخته می شه.
یعنی اگر یک ip حدود نیم ساعت غیر فعال باشه و برگرده بعنوان یک یوزر جدید شناخته می شه ولی اگر مداوما کار کنه و وقفه ی بزرگی نداشته باشه دیگه به عنوان یک یوزر جدید شناخته نمی شه. حتی اگر دو ساعت دادئما مشغول به کار باشه.
توی دیتابیسم یک فیلد دارم به نام ip یک فیلد هم دارم به نام date_sever که از نوع dateTime است. اگر فیلد دیگری نیز لازمه بگید. البته فیلدهای دیگری نیز هست ولی مربوط به صحبتمان نمی شه.

آیا می توانید یک کوئری بنویسید که این رنج نیم ساعت را در خودش محاسبه کنه و تعداد ویزیتور های من را بصورت count برگردونه. بنظر یک کم پیچیده می یاد.

یوسف زالی
یک شنبه 15 آبان 1390, 12:27 عصر
دوست من کافیه در where شرط زمان رو اضافه کنید.
اونوقت count خودش روی where شمارش می کنه.

khadem1386
یک شنبه 15 آبان 1390, 12:42 عصر
ببخشید شما ظاهرا سوال من را نخواندید.

می خواهم با یک دستور، تعداد کل ویزیتور های خودم را در تاریخ 3-10-2011 را پیدا کنم.

هر بار که page من خوانده می شه ip و ساعت و تاریخ ثبت می شه.
در نظر داشته باشید که من با تعداد ویزیت کاری ندارم تعداد افراد یا ویزیتورها یا یوزرها برام مهم است.

تعریف ویزیتور: هر آی پی جدید یک ویزیتور به حساب می یاد
و همچنین اگر یک آی پی قبلن در دیتابیس ثبت شده باشه ولی تاریخ ثبت آن نیز از نیم ساعت قبل تر باشه بعنوان یک ویزیتور جدید شناخته می شه

لطفا اگر می شه کوئری مورد نظر خود را بنویسید. تا دقیقا منظور شما را متوجه بشم.

به نظر من شرط زمانی باید یک جایی توی group by یا نام فیلد ها قرار بگیره. یک شرط زمانی هم داریم که بصورت 24 ساعته می باشد. آنرا استفاده کردم. در دستور where
به نظر من این کار یک نوع گروه بندی خاص می خواد.

یوسف زالی
یک شنبه 15 آبان 1390, 13:02 عصر
اتفاقا خوندم که دارم جواب می دم.

select count(1) from VisitTBL
where VisitorID not in (select VisitID from VisitTbl where DateDiff(MI, VisitTime, getdate()) < 30) -- time test
group by VisitorID

khadem1386
یک شنبه 15 آبان 1390, 13:55 عصر
خیلی ممنون از پاسخ شما ولی
ببیند ویزیتور ها من ID ندارند.

فقط هر ویزیت من یک ID داره. که در واقع همان آی دی اصلی من است.
این جدول من است
[Date_server] ,[reffer] ,[Url] ,[Title] ,[IP], [Id]

در واقع ما می خواهیم یک حالت distinct پیش رفته مشروط برای قسمت count بنویسیم

بعدش اینکه شما از فانکشن getdate استفاده کردید . که این یعنی زمان حال را بر می گردانه در صورتی که می نمی خوام با زمان حال مقایسه کنم باید آنرا با زمان آخرین ip که شبیه آن هست مقایسه بشه.

در ضمن متوجه لزوم گزینه GROUPBY که در انتها نوشتید، نشدم
با تشکر از وقت شما

یوسف زالی
یک شنبه 15 آبان 1390, 15:33 عصر
دوست من ID در اینجا همون IP هست.
برای استفاده خودتون پارامتر های DiffDate رو طبق نیازتون اصلاح کنید.
group by هم برای اینه که برای هر بازدید کننده جمع جداگانه ایجاد بشه.

khadem1386
دوشنبه 16 آبان 1390, 16:27 عصر
خیلی ممنونم
من سعی کردم کد شما اینجوری کاملش بکنم ولی ظاهرا جاییش غلط است


select count(1) AS countt , A.ip , A.[Date_server]
FROM MyTab A
where A.IP NOT in (select B.IP , B.[Date_server]
FROM MyTab B
where DateDiff(MI, B.[Date_server], A.[Date_server]) > 30 and A.ip = B.ip )
and CONVERT(VARCHAR(10),(Date_server), 105) = '24-10-2011'


پیقام می ده که در subquery که استفاده می کنید فقط اجازه استفاده از یک ستون یا "expression " را دارید.



صورت مساله:
همه آی پی های یکسان یک ویزتور حساب می شند.
آی پی که نیم ساعت سایت را ترک کرده باشه و برگرده یک ویزیتور جدید بحساب می یاد.
می شه با توجه به صورت مساله این کوئری را کاملترش کنید.
مرسی از وقت شما