PDA

View Full Version : یک کوئری optional



zerocool151
یک شنبه 03 شهریور 1392, 13:16 عصر
سلام من یک جدول دارم بصورت زیر البته با سطح داده ای بیشتر

title type
---------------
Music 2
Note 2
Movie 1
Serial 1
Book 3
classical 3

1-فکر کنید من میخوام سلکت کنم با order by Type desc اما نمیخوام همیشه به یک صورت نمایش بده
مثلا اگر یه بار اول music رو نمایش داد بعد Note رو بار دیگه Note رو نمایش بده بعد Music رو
گفتم این داده ها در حد مثاله و خیلی وسیع تره تعدادشون، برای تمامی Type ها این صدق میکنه
2-حالا آخرین Type توی این واکشی میخوام فقط 30 تاشو نمایش بده یعنی مثلا اگه آخریش Type=1 بود فقط 30تاشو نمایش بده
امیدوارم متوجه شده باشید

N_D
یک شنبه 03 شهریور 1392, 13:26 عصر
Select * from Test
order by Type,1+(ABS(Binary_CheckSum(NEWID())) %2)

zerocool151
یک شنبه 03 شهریور 1392, 13:53 عصر
چی میگه ؟؟:لبخندساده:
خوب این چیکار میکنه چجوری کار میکنه؟
نیازارو براورده میکنه؟
یه توضیحه ریزی میدی؟

N_D
دوشنبه 04 شهریور 1392, 11:57 صبح
ببخشید کد بالا کامل نیست
کد زیر رو آزمایش کنید .. با تغییر مقدار TOP@ میتونین دسته ها رو تغییر بدین. ولی در مورد آخرین 30 تا باشه متوجه منظورتون نشدم .. زحمتی نیست یه مثال بیارین و خروجی را نمایش بدین.


CREATE TABLE #Temp( Title varchar(50), Type int);
INSERT #Temp VALUES
('Music' ,2),
('Note' ,2),
('Movie' ,1),
('Serial' ,1),
('Book' ,3),
('classic',3),
('jaz' ,1),
('blooz' ,2),
('country',3),
('Rock' ,2),
('Car' ,2),
('Rock' ,1),
('Car' ,1),
('classic',1),
('jaz' ,3),
('jaz' ,2) ;

DECLARE @Top int = 3

SELECT A.* FROM #Temp A
CROSS APPLY (
SELECT TOP (@Top) BINARY_CHECKSUM(NEWID()) as Rnd,title,Type
FROM #Temp
WHERE Type = A.Type
ORDER BY Rnd
) B
WHERE A.title = B.title
ORDER BY 2;

DROP Table #Temp;

N_D
دوشنبه 04 شهریور 1392, 12:13 عصر
البته یه برداشتی دیگه هم دارم و اون اینکه به ازای کوچکترین TYPE باید 30 تا برگردونده بشه ولی برای بقیه تمام ردیفها.. به عبارت دیگه (MIN(TYPE باید محدود بشه چون همیشه آخرین مقدار ORDER BY TYPE DESC برابر با (MIN(TYPE هست.. با این اوصاف این کوئری جواب شماست که فقط برای آخری 2 تا ردیف بر میگردونه.. البته این برداشت من بود زحمتی نیست درست یا غلط اونرو بنویسید..



CREATE TABLE #Temp( Title varchar(50), Type int);
INSERT #Temp VALUES
('Music' ,2),
('Note' ,2),
('Movie' ,1),
('Serial' ,1),
('Book' ,3),
('classic',3),
('jaz' ,1),
('blooz' ,2),
('country',3),
('Rock' ,2),
('Car' ,2),
('Rock' ,1),
('Car' ,1),
('classic',1),
('jaz' ,3),
('jaz' ,2) ;

DECLARE @Top int = 2

SELECT A.* FROM #Temp A
CROSS APPLY (
SELECT
TOP ( CASE WHEN TYPE=(SELECT MIN(TYPE) FROM #Temp) THEN @Top ELSE 1000000000 END)
BINARY_CHECKSUM(NEWID()) as Rnd,title,Type
FROM #Temp
WHERE Type = A.Type
ORDER BY Rnd
) B
WHERE A.title = B.title
ORDER BY 2 desc;

DROP Table #Temp;

N_D
دوشنبه 04 شهریور 1392, 13:17 عصر
راه حل دیگه .. بهتره تو دیتا ی بالا تست کنی


DECLARE @Top int = 2

SELECT Title, Type
FROM (
SELECT
Title, Type,
MIN(type) over (order by type) minD,
ROW_NUMBER() over (partition by type order by type) rowD
FROM Temp
) aaa
WHERE (minD = Type and rowD < @TOP ) or (minD <> type )
ORDER BY TYPE DESC , NEWID()

hramezani
چهارشنبه 06 شهریور 1392, 16:15 عصر
اینو امتحان کنین


SELECT * FROM #Temp order by Type,NEWID()

مرتب کردن بر اساس newID هر دفعه رکورد رندوم به شما برمیگردونه

zerocool151
چهارشنبه 06 شهریور 1392, 19:02 عصر
اینو امتحان کنین


SELECT * FROM #Temp order by Type,NEWID()

مرتب کردن بر اساس newID هر دفعه رکورد رندوم به شما برمیگردونه
جواب داد ممنون
حالا فکر کن کوچکترین type رو من میخوام 30تا ازش نمایش بده توی همین کوئری
اون و باید چیکار کرد؟؟
از دوست خوبن _D بخاطر وقتی که گذاشت ممنونم
راستش تست نکردم راه تو ولی بازم ممنون

hramezani
جمعه 08 شهریور 1392, 15:58 عصر
منظورتون یکی از این دو حالت هست احتمالا
SELECT TOP(30)* FROM #Temp order by Type,NEWID()
یا
SELECT TOP(30)* FROM #Temp
WHERE Type =(SELECT MIN(Type) FROM #Temp)
order by NEWID()