PDA

View Full Version : منحصر و مشخص کردن جزیره ها و گروه بندی آنان



M_Designer
پنج شنبه 24 تیر 1389, 08:19 صبح
سلام
خوبیننننن؟
خلاصه اینکه می خوام همچین کوریی داشته باشم که اینگونه باشه:




Number | Value
===============================
1 0
--------------------------------------------------------
2 5
--------------------------------------------------------
4 4
--------------------------------------------------------
5 2
--------------------------------------------------------
6 3
--------------------------------------------------------

Result after excuting the Query:

Row Count Value Sum
-----------------------------------------------
2 5
-----------------------------------------------
3 9

MOJTABAATEFEH
پنج شنبه 24 تیر 1389, 11:44 صبح
دوست عزیز توضیح بیشتر بده با این چیزی که شما نوشتی کسی نمیتونه راهنماییت کنه!

محمد سلیم آبادی
پنج شنبه 24 تیر 1389, 12:31 عصر
DECLARE @t TABLE
(Number INTEGER NOT NULL PRIMARY KEY,
Value INTEGER NOT NULL);

INSERT INTO @t VALUES
(1, 0), (2, 5), (4, 4), (5, 2), (6, 3);

SELECT * FROM @t
/*
Number Value
----------- -----------
1 0
2 5
4 4
5 2
6 3
*/

SELECT COUNT(*) AS [Row Count],
SUM(Value) AS [Value Sum]
FROM ( SELECT NTILE(2) OVER(ORDER BY Number DESC),
Value
FROM @t
) AS D(group_id, Value)
GROUP BY group_id
ORDER BY [Row Count];

/*
Row Count Value Sum
----------- -----------
2 5
3 9
*/

M_Designer
پنج شنبه 24 تیر 1389, 12:50 عصر
فکر میکنم مثال واضح باشه و جناب Msalim پاسخ دادن
ببینید من یک جدول دارم که می خوام رکوردهای مجاور را در یک گروه نمایش دهم مثلا اگر فیلد number رکورد ها 1 و 2 و 3 و 4 و5 بود، هر 5تا رکورد را در یک گروه نمایش دهد و به این ترتیب ادامه رکوردها بررسی می شوند
امیدوارم توضیحم کامل باشه

محمد سلیم آبادی
پنج شنبه 24 تیر 1389, 13:27 عصر
فکر میکنم مثال واضح باشه و جناب Msalim پاسخ دادن
ببینید من یک جدول دارم که می خوام رکوردهای مجاور را در یک گروه نمایش دهم مثلا اگر فیلد number رکورد ها 1 و 2 و 3 و 4 و5 بود، هر 5تا رکورد را در یک گروه نمایش دهد و به این ترتیب ادامه رکوردها بررسی می شوند
امیدوارم توضیحم کامل باشه



DECLARE @t TABLE
(Number INTEGER NOT NULL PRIMARY KEY,
Value INTEGER NOT NULL);

INSERT INTO @t VALUES
(1, 0), (2, 5), (4, 4), (5, 2), (6, 3);

/*
Number Value
----------- -----------
1 0
2 5
4 4
5 2
6 3
*/
SELECT COUNT(*) AS [Row Count],
SUM(Value) AS [Value Sum]
FROM
(
SELECT (SELECT MAX(number)
FROM @t t1
WHERE NOT EXISTS
(SELECT 1
FROM @t
WHERE Number = t1.Number-1)
AND Number < t.Number) AS start_gap,
number as end_gap
FROM @t t
WHERE NOT EXISTS
(SELECT 1
FROM @t
WHERE Number=t.Number+1)
) D
INNER JOIN @t T
ON T.Number BETWEEN D.start_gap AND D.end_gap
GROUP BY D.start_gap ;

/*
Row Count Value Sum
----------- -----------
2 5
3 9
*/

محمد سلیم آبادی
پنج شنبه 24 تیر 1389, 14:15 عصر
اگر از نسخه ی 2005/2008 نرم افزار SQL Server دارین استفاده می کنید.
این روش فوق العاده موثر تر از روش قبلی است.


SELECT COUNT(*) AS [Row Count],
SUM(Value) AS [Value Sum]
FROM
(
SELECT *, Number - ROW_NUMBER() OVER(ORDER BY Number) AS rec_id
FROM @t
) AS D
GROUP BY rec_id;

M_Designer
شنبه 26 تیر 1389, 10:27 صبح
اگر میشد 10 بار نه 1000 دکمه تشکر را میزدم
دوست من کاش کمی در مورد این کوری توضیح میدادین ، مثلا کار چرا از over استفاده شده یا اینکه As D چرا باید باشه...

محمد سلیم آبادی
شنبه 26 تیر 1389, 12:29 عصر
دوست من کاش کمی در مورد این کوری توضیح میدادین ، مثلا کار چرا از over استفاده شده یا اینکه As D چرا باید باشه...
ماده ی OVER برای دو منظور استفاده میشه. Rankingو Aggregate. که در اینجا برای منظور اول بکار گرفته شده که می تونید برای یادگیری به این مقاله رجوع کنید:
http://www.30sharp.com/ShowArticle.aspx?nid=13&did=231&AuthorID=11

AS D را برای نام مستعار دادن به عبارت جدولی مشتق شده (Derived Table Expression) استفاده کردم.

محمد سلیم آبادی
یک شنبه 27 تیر 1389, 13:49 عصر
http://www.30sharp.com/ShowArticle.aspx?nid=13&did=241&AuthorID=11