كيف يمكنني أن أفعل مجموعة متجاورة من قبل في الخلية ؟
سؤال
كيف يمكنني إرجاع ما يمكن أن يكون فعال "متجاورة" الفريق في الخلية.وبعبارة أخرى مجموعة من يحترم النظام من مجموعة السجلات?
على سبيل المثال ، SELECT MIN(col1), col2, COUNT(*) FROM table GROUP BY col2 ORDER BY col1
من الجدول التالي حيث col1 هي فريدة من نوعها أمر مؤشر:
1 a 2 a 3 b 4 b 5 a 6 a
العوائد:
1 a 4 3 b 2
ولكن أنا في حاجة إلى إعادة التالية:
1 a 2 3 b 2 5 a 2
المحلول
استخدم:
SELECT MIN(t.id) 'mi',
t.val,
COUNT(*)
FROM (SELECT x.id,
x.val,
CASE
WHEN xt.val IS NULL OR xt.val != x.val THEN
@rownum := @rownum+1
ELSE
@rownum
END AS grp
FROM TABLE x
JOIN (SELECT @rownum := 0) r
LEFT JOIN (SELECT t.id +1 'id',
t.val
FROM TABLE t) xt ON xt.id = x.id) t
GROUP BY t.val, t.grp
ORDER BY mi
كان والمفتاح هنا لخلق قيمة المصطنعة التي من شأنها أن تسمح للتجمع.
وفي السابق، تصحيح الإجابة Guffa ل:
SELECT t.id, t.val
FROM TABLE t
LEFT JOIN TABLE t2 on t2.id + 1 = t.id
WHERE t2.val IS NULL
OR t.val <> t2.val
نصائح أخرى
وإذا كانت الأرقام في COL1 هي متجاورة، يمكنك أن تفعل مثل هذا:
select x.col1, x.col2
from table x
left join table y on x.col1 = y.col1 + 1
where x.col2 <> isnull(y.col2, '')
وهي تعمل مثل هذا:
-x- -y- out
1 a - - 1 a
2 a 1 a
3 b 2 a 3 b
4 b 3 b
5 a 4 b 5 a
6 a 5 a
نفس المنطق كما rexem ، ولكن يعمل على أي النوافذ قادرة RDBMS (لن يعمل على الخلية حتى الآن):
CREATE TABLE tbl
(
id INT,
val VARCHAR(1)
);
INSERT INTO tbl(id,val)
VALUES(1,'a'),(2,'a'),(3,'a'),(4,'a'),(5,'b'),(6,'b'),(7,'a'),(8,'a'),(9,'a');
المصدر:
1 a
2 a
3 a
4 a
5 b
6 b
7 a
8 a
9 a
النوافذ على النمط الاستعلام: (يعمل على النوافذ قادرة rdbms):
WITH grouped_result AS
(
SELECT x.id, x.val,
COUNT(CASE WHEN y.val IS NULL OR y.val <> x.val THEN 1 END)
OVER (ORDER BY x.id) AS grp
FROM tbl x LEFT JOIN tbl y ON y.id + 1 = x.id
)
SELECT MIN(id) mi, val, COUNT(*)
FROM grouped_result
GROUP BY val, grp
ORDER BY mi
الإخراج:
1 a 4
5 b 2
7 a 3
راجع للشغل, هذا هو نتيجة grouped_result دون المجموعة من خلال:
1 a 1
2 a 1
3 a 1
4 a 1
5 b 2
6 b 2
7 a 3
8 a 3
9 a 3
يشعر جيدة كتابة mysqlism-الاستعلام إلى ANSI-المطابقة واحد :-) الآن, في حين أن الخلية لا يكون النوافذ capabality بعد rexem الجواب هو أفضل واحد.Rexem هذه الخلية تقنية(الانضمام إلى (SELECT @rownum := 0)) هناك ، afaik MSSQL و كيو لا تدعم ضمنا أعلن متغير, مجد!:-)
وهذا لن ينجح:
SELECT min_col1 = MIN(col1), col2
FROM table
GROUP BY col2
ORDER BY min_col1
ولعل هذا؟
SELECT min_col1, col2
FROM ( SELECT min_col1 = MIN(col1), col2
FROM table
GROUP BY col2 ) x
ORDER BY min_col1
هنا ووصف أطول من الأساس نفسه (على ما أظن) حل تقدمها-المهور OMG - "خلق قيمة المصطنعة التي من شأنها أن تسمح للتجمع"
وأنا أعلم سئل هذا السؤال اثنين وقبل نصف سنة (وأنا لا أتوقع أي upvote)، ولكني واجهت نفس المشكلة بالضبط، إلا أنه كان 'الجدول' بالفعل بيان SQL معقدة جدا، لذلك أنا لا يمكن أن تجعل أي الانضمام دون نسخ لصق أنه
وهكذا كان لي فكرة أخرى: أمر من col2 وsubstract رقم الصف الحالي إلى قيمة COL1
SELECT *, col1-(@rownum:=@rownum+1) FROM (SELECT * FROM table JOIN (SELECT @rownum:=0) AS i ORDER BY col2) AS t
والذي يعطي نتيجة من هذا القبيل:
1 a 0
2 a 0
5 a 2
6 a 2
3 b -2
4 b -2
والآن تحتاج فقط إلى مجموعة من قيمة العمود الأخير
SELECT MIN(col1) AS mi, col2, COUNT(*) FROM
(SELECT *, col1-(@rownum:=@rownum+1) AS grp FROM (SELECT * FROM table JOIN (SELECT @rownum:=0) AS i ORDER BY col2) AS t) AS x
GROUP BY grp ORDER BY mi