آخرین فرصت تا %60 تخفیف خرید یکجای دوره ها برای 4 نفر فقط تا
00 00 00
Ehsan_Ycom

مقایسه تاریخ و بازیابی موارد ثبت شده

عرض سلام و احترام

من یک دیتا دارم شامل موارد ثبت شده با تاریخ و ساعت (در یک بازه زمانی)هست که میخوام تاریخ این آیتم ها رو مقایسه کنم و آیتم های ثبت شده در روز اول و روز آخر رو در خروجی بیارم.واضح ترش اینه که مثلا من از تاریخ یک فروردین تا ده فروردین بیست آیتم دارم که سه آیتم مربوط به یک فروردین و دو آیتم مربوط به ده فروردین هست.خروجی که میخوام نمایش این 5 آیتم هست

با تشکر 

لذت یادگیری با توسینسو
به عنوان شخصی که مدت هاست از سایت توسینسو استفاده می کنم باید بگم که واقعاً یکی از بهترین مرجع ها برای ارتقاء دانش شخصی هست. دوره های سایت، راهکارها و مطالب، همگی عالی هستند.
علی آقامیری

دوست عزیز ، یه گرافی ، شکلی ، جدولی ، نموداری ، چیزی بدید که حداقل راحت تر بفهمیم چی می خواید.

اصلا این دیتا کجا هست ؟ text ؟ excel ؟ sql ؟

 

** هیچ اگر سایه پذیرد ، منم آن سایه هیچ **
Ehsan_Ycom

sql.مثل مثال پایین نتیجش هشت تا آیتم هست که من اولی و دو تای اخر رو میخوام در خروجی

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
USE master;
GO
CREATE DATABASE IceCreamFactory1;
GO
USE IceCreamFactory1;
GO
CREATE SCHEMA IceCream;
GO
CREATE TABLE IceCream.Orders
(
    OrderID int identity(1, 1) not null,
    OrderedPeriod DateTime2 null
);
GO
INSERT IceCream.Orders(OrderedPeriod)
VALUES(N'2012-02-14 10:12'), (N'2012-02-15 09:08'),
      (N'2012-05-10 15:24'), (N'2012-07-04 14:01'),
      (N'2012-04-18 19:16'), (N'2012-04-18 09:15'),
      (N'2012-04-18 12:48'), (N'2012-07-04 11:26');
GO
SELECT OrderID, OrderedPeriod FROM IceCream.Orders
ORDER BY OrderedPeriod;
GO
علی آقامیری

می تونید اولی رو بگیریرد و با دو تای  آخر union کنید : (شاید بهترین راه نباشه )

(SELECT <some columns>
FROM mytable
<maybe some joins here>
WHERE <various conditions>
ORDER BY date DESC
LIMIT 1)

UNION ALL

(SELECT <some columns>
FROM mytable
<maybe some joins here>
WHERE <various conditions>
ORDER BY date ASC    
LIMIT 2)
** هیچ اگر سایه پذیرد ، منم آن سایه هیچ **
آرش

سلام دوست عزیز

خداییش علی آقا راست گفتن، من چندبار سوالو خوندم،آب و روغن قاطی کردم  :)

Ehsan_Ycom

سلام و عرض احترام.این sp  فقط مختص این هشت تا داده نیست و یا در همه موارد یکی از روز اول و دوتا از روز آخر نیست ممکنه در بعضی موارد روز اول سه تا و روز آخر سه تا درخواست یا روز اول دو تا و روز آخر پنج تا درخواست یا .... به همین ترتیب متفاوت هست

علی آقامیری

این دستورات اول همه چیز رو order by date ( که برای شما میشه order by OrderedPeriod  ) میکنه اولی رو بر میداره ، 

بعد دوباره همه چیز رو order میکنه و دوتای آخر رو بر میداره ، چه طور ممکنه سه تا از روز اول برداره ؟ یعنی نتیجه DESC و ASC یکی شده ؟ 

راستش متوجه نمیشم ، برای توضیح بیشتر تصویر جدول و کوئری و خروجیش رو بزارید. خروجی دقیقی هم که می خواید رو یا علامت گذاری کنید یا خودتون یه جا بنویسید.

** هیچ اگر سایه پذیرد ، منم آن سایه هیچ **
Ehsan_Ycom

بذارید یه بار دیگه بگم اصل کار اینه هر در خواستی در روز اول و هر درخواستی در روز آخر برای هر فرد ثبت میشه رو من در خروجی میخوام

حالا برای مثال

فرد اول دو   درخواست در روز اول و دو درخواست در روز آخر داره

فرد دوم یک درخواست در روز اول و سه درخواست در روز آخر داره

فرد سوم سه درخواست در روز اول و سه درخواست در روز آخر داره

---------------------------------

sp نوشته شده به صورتی عمل میکنه که اول مشخصات فرد رو به همراه درخواست هاش بازیابی میکنه مثلا برای فرد اول 44 درخواست طی ده روز ثبت شده که (دو   درخواست در روز اول و دو درخواست در روز آخر داره)

اتفاقی که الان باید بیوفته اینه که 44 درخواست رو بررسی کنه و فقط دو درخواست روز اول  دو درخواست روز آخر رو در خروجی بیاره

حالا sp باید این قابلیت رو داشته باشه که وقتی درخواست نفر دوم رو بررسی میکنه مثلا 50 درخواست طی 20 روز .دوباره فقط درخواست های روز اول و آخر رو که (یک درخواست در روز اول و سه درخواست در روز آخر ) هست در خروجی بیاره

---------------------------

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

sp الان با یک select top 1 و یک orderby acs , desc میتونه درخواست اول و اخر فرد رو بیاره در خروجی ولی هدف من که درخواست های روز اول و آخر هست محقق نمیشه

علی آقامیری

خب شما دارید سوال رو کاملا تغییر میدید ! از اول هم گفتم که سوالتون رو نامفهوم بیان کردید.

چیزی که شما خواستید سه تا رکورد بود ، اولی و دو تای آخر

".مثل مثال پایین نتیجش هشت تا آیتم هست که من اولی و دو تای اخر رو میخوام در خروجی" 

 

الان به نظر همه سفارش های روز اول و همه سفارش های روز آخر یک فرد خاص رو می خواید. 

چیزی که واضحه شما اصلا تو جدول چیزی به عنوان persionID که نماینده شماره یا کد مشتری باشه ندارید ، چه جوری می خواید فیلترش کنید ؟

 

** هیچ اگر سایه پذیرد ، منم آن سایه هیچ **
Ehsan_Ycom

persionID رو هم اضافه کردم الان تنها مشکلی که دارم اینه که همه درخواست های یک نفر رو تشخیص میده.با SELECT خالی همه درخواست ها میاد . با SELECT TOP 1 اولین و اخرین درخواست ولی من چیزی که میخوام همون حرف شما

(الان به نظر همه سفارش های روز اول و همه سفارش های روز آخر یک فرد خاص رو می خواید. )

را میخوام بهش برسم

شرمنده که سوال رو درست مفهموش رو نرسوندم.بازم معذرت میخوام

علی آقامیری

personId رو به این کد بدید :

 

select * from myTable
where 
    (
 CONVERT(date, orderperiod) = (select min(orderperiod) from myTable where personID=@personID  ) or 
    CONVERT(date, orderperiod) = (select max(orderperiod) from myTable where personID=@personID  )
 )
    and personID=@personID
 order by orderperiod

** هیچ اگر سایه پذیرد ، منم آن سایه هیچ **
مجتبی رضایی

احسان جان سلام.

شما باید از dense_rank استفاده کنید.

 

اسکریپتش رو براتون نوشتم.


create table myTable
(ID int not null ,
PersonID int not null,
Regdate datetime
)


insert into myTable values(1,101,'2020-02-01 02:37:15.667')
insert into myTable values(2,101,'2020-02-01 05:11:15.667')
insert into myTable values(3,101,'2020-02-01 08:43:15.667')

insert into myTable values(4,101,'2020-02-02 05:11:15.667')
insert into myTable values(5,101,'2020-02-02 08:43:15.667')

insert into myTable values(6,101,'2020-02-03 02:37:15.667')

insert into myTable values(7,101,'2020-02-04 05:11:15.667')
insert into myTable values(8,101,'2020-02-04 08:43:15.667')

--------------------------------------------------------------------------------
insert into myTable values(9,102,'2020-02-01 02:37:15.667')
insert into myTable values(10,102,'2020-02-01 05:11:15.667')

insert into myTable values(11,102,'2020-02-02 08:43:15.667')
insert into myTable values(12,102,'2020-02-02 05:11:15.667')
insert into myTable values(13,102,'2020-02-02 08:43:15.667')

insert into myTable values(14,102,'2020-02-04 02:37:15.667')
insert into myTable values(15,102,'2020-02-04 05:11:15.667')
insert into myTable values(16,102,'2020-02-04 08:43:15.667')


select ID 
  ,PersonID 
  ,Regdate
from (
  select ID 
    ,PersonID 
    ,Regdate
    ,dense_rank() over(partition by PersonID order by convert(date, RegDate) asc ) firstData
    ,dense_rank() over(partition by PersonID order by convert(date, RegDate) desc) lastData
  from myTable
) dts
where firstData = 1 or lastData = 1
order by PersonID , Regdate

پاسخ شما
برای ارسال پاسخ خود وارد شوید.
از سرتاسر توسینسو
تنظیمات حریم خصوصی
تائید صرفنظر