2016-04-23 13 views
-4

Bitte lassen Sie mich wissen, ob es einen Syntaxfehler ist, weil, wie pro mein Verständnis, die Abfrage ist perfekt:Gibt es einen Syntaxfehler, weil, wie pro mein Verständnis, die Abfrage ist perfekt

mysql> SELECT Cust_Id,Plan_Id FROM(SELECT Cust_Id,Plan_Id,ROW_NUMBER() OVER (PARTITION BY Cust_Id ORDER BY cnt DESC) AS RN FROM(SELECT Cust_Id,Plan_Id,COUNT(1) as cnt FROM customer GROUP BY (Cust_Id,Plan_Id))) WHERE RN =1; 
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual 
that corresponds to your MySQL server version for the right syntax to use 
near '(PARTITION BY Cust_Id ORDER BY cnt DESC) AS RN FROM(SELECT Cust_Id,Plan_Id,COUNT' 
at line 1 
+0

eindeutig neu zu schreiben, müssen Sie eine Diskussion mit Ihrem DBMS (MySQL) haben, weil sie mit Ihnen über die Perfektion des SQL nicht einverstanden ist. Insgesamt vermute ich, dass das DBMS korrekt ist und Ihre Ansprüche an Perfektion übertrieben sind. Welche Version von MySQL verwenden Sie? –

+1

Dies ist Microsoft SQL SERVER Syntax nicht mysql. Mysql hat nicht die row_number() over() Konstrukt –

+0

Anscheinend ist Ihr Verständnis falsch. Du solltest daran arbeiten, denn das Verständnis ist meistens wichtig. –

Antwort

1

MYSQL tut nicht unterstützt ROW_NUMBER().

Sie haben Ihre Frage, wie unten

SELECT Cust_Id,Plan_Id 
FROM (
     SELECT Cust_Id,Plan_Id, 
       @row_num := IF(@prev_value=T.Cust_Id,@row_num+1,1) AS RN, 
       @prev_value := T.Cust_Id 
     FROM (
      SELECT Cust_Id,Plan_Id,COUNT(1) as cnt 
      FROM customer 
      GROUP BY (Cust_Id,Plan_Id) 
      ) T, 
      (SELECT @row_num := 1) x, 
      (SELECT @prev_value := 0) y 
    )S WHERE RN =1;