2016-05-25 10 views
0

Obwohl es so klingen mag, ich möchte Fensterfunktion Powerpivot Tabelle hinzufügen, aber ich bin nicht ... Ich möchte Datensätze basierend auf Fensterfunktion ausschließen.SQL-Analyse-Funktion zu DAX

Ich habe eine solche Abfrage ähnlich wie diese (SQL Server):

Select Line_Number, 
     Suite_name, 
     Group_Name, 
     Revision, 
     Status 
FROM (
    select Line_Number, 
      Suite_Name, 
      Group_Name, 
      Revision, 
      Status, 
      Row_Number() OVER (Partition by Line_Number, Suite_Name, Group_Name order by Revision Desc) r 
    From TableA 
    ) t 
where t.r = 1 

Diese Abfrage liefert die höchste Zeile der Revision pro Line_Number, Suite_Name und Group_Name.

Ich möchte das gleiche tun, aber mit DAX in Excel Power Pivot.

Das Ergebnis wird die Anzahl der Zeilennummern sein, aber für die ausgewählte (Slicer) Suite und Gruppe.

Das Ziel besteht darin, alle Zeilen in das tabellarische Datenmodell zu wählen und dann unter Verwendung ähnlicher Funktionen die Datensätze zu filtern und nur die aktuellste Version pro angewendetem Slicer beizubehalten.

Ich habe versucht, so weit: CALCULATE, FILTER, TOPN, RANKX, GENERATE. Keine von ihnen hat mir geholfen dynamisch "auszuschließen" Zeilen aus der Berechnung.

Kann jemand einen Ansatz vorschlagen?

Danke!

+0

danke @ Gofr1! Wie Sie wahrscheinlich bemerkt haben, hatte ich Probleme damit, die Frage OK zu machen – sliber

Antwort

1

Ein Vorschlag könnte sein, eine berechnete Spalte zu verwenden, um den maximalen Revisionswert zu finden, indem die frühere Funktion verwendet wird. Dies funktioniert nicht, wenn Sie einen dynamischen Filter für eine Reihe von Revisionen haben möchten.

calc_column01: =CALCULATE(max(myTable[revision]),filter(myTable,myTable[line_number]=EARLIER(myTable[line_number])&&myTable[suite_name]=earlier(myTable[suite_name])))

Dann fügen Sie eine measure01: =CALCULATE(VALUES(myTable[status]),filter(ALLSELECTED(myTable),myTable[revision]=max(myTable[calc_column01])))

powerpivot window

sampledate und führen in Power:

result

+0

Ihr Vorschlag würde nur funktionieren, wenn der Benutzer Slicer nicht auswählen kann. Der Prozess ist wie: Lassen Sie mich wissen, was Ihre Slicer sind, dann erhalten Sie die neueste Revision für diese Slicer. Ich habe eine Lösung dafür gefunden (funktioniert aber ziemlich langsam auf 7m Records - siehe meine Antwort unten) – sliber

0

Es scheint, dass ich die Dinge richtig gemacht, aber während ich Lösungen für dieses I reali erforsche zed, dass manchmal Zellenreferenz die Arbeit nicht macht, so musste ich in 3 Schritten arbeiten. Um Komplexität in meiner Frage zu reduzieren, habe ich nicht erwähnt, dass ich auch viele zu viele Tabellen habe. Einige Codebeispiele:

Last rev:=CALCULATE(MAX(REV), 'TABLE B', 'TABLE C') 

Nun, wenn ich zum ersten Mal, Dinge zu tun versucht, ist dies, wie der Code aussah:

Total Lines:=CALCULATE(COUNTROWS(TABLE A), 'TABLE B', 'TABLE C', FILTER(ALLSELECTED(TABLE A[REV]), [REV] = Last Rev)) 

Leider dies nicht funktionierte, also musste ich den Code aktualisieren dies:

Total Lines:=CALCULATE(COUNT('TABLE A'[REV]), 'TABLE B', 'TABLE C', FILTER(ALL('TABLE A'[REV]), [REV] = CALCULATE(MAX(REV), 'TABLE B', 'TABLE C'))) 

Nur dann hat der Filter, nach dem ich suchte, wirklich den Job gemacht. Nachdem sie dies getan hatte ich noch richtig mit summarise zu beschäftigen, so hatte ich die Gesamt Linien Maßnahme mit einer anderen Summe Ausdruck wickeln, sonst werde ich nur „1“ erhalten: Total:=SUMX(VALUES('Table A'[LINE_NUMBER]),[Total])

Mehr Infos über 'Table B' und 'Table C': dies sind viele zu viele Tabellen, 'Table B' ist die Zwischentabelle und 'Table C' ist die Dimensionstabelle selbst

Verwandte Themen