كيف يمكنني أن أفعل مجموعة متجاورة من قبل في الخلية ؟

StackOverflow https://stackoverflow.com/questions/1610599

  •  05-07-2019
  •  | 
  •  

سؤال

كيف يمكنني إرجاع ما يمكن أن يكون فعال "متجاورة" الفريق في الخلية.وبعبارة أخرى مجموعة من يحترم النظام من مجموعة السجلات?

على سبيل المثال ، 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top