2016-06-15 17 views
0

Ich habe eine Ansicht, die alle Daten konzentriert, die ich brauche, um eine Liste mit Einrichtung und das billigste Bier an diesem Ort zu zeigen. Manchmal brauche ich die Einrichtung filtern und den Preis für das billigste Bier nach mit dem Etikett und Verpackung des Bieres, so bin ich der Meinung gibt eine Menge von Linien mit fast dem gleichen Ergebnis:SQL/Spring Daten - wie die komplette Zeile basierend auf min Wert in Spalte und distinct ID erhalten

Table

Die Zeilen markiert mit rotem Quadrat sind diejenigen, die ich zeigen möchte. Um die Ergebnismenge zu erhalten, wie im Bild habe ich JpaSpecificationExecutor mit einigen Spezifikationen verwendet wird, ist die letzte SQL dies:

SELECT 
    visaoaplic0_.id_estabelecimento , 
    visaoaplic0_.embalagem_id   , 
    visaoaplic0_.rotulo_id   , 
    visaoaplic0_.nome_cidade   , 
    visaoaplic0_.nome_embalagem  , 
    visaoaplic0_.nome_estabelecimento , 
    visaoaplic0_.nome_estado   , 
    visaoaplic0_.preco    , 
    visaoaplic0_.tipo_estabelecimento, 
    visaoaplic0_.icone    , 
    visaoaplic0_.icone_content_type 
FROM visao_app_aba_locais visaoaplic0_ 
WHERE upper(visaoaplic0_.nome_cidade) = 'MONTES CLAROS' AND  upper(visaoaplic0_.nome_estado) = 'MINAS GERAIS' AND 
    (upper(visaoaplic0_.nome_estabelecimento) LIKE '%') AND 
    (visaoaplic0_.tipo_estabelecimento IN (1006, 1053, 1148, 1008, 1009, 1007)) AND 
    (visaoaplic0_.id_estabelecimento IS NOT NULL); 

Das Problem ist jetzt, dass ich keine Ahnung, wie bekommen nur die Zeilen Ich brauche weder Verwenden von SQL oder Verwenden der Kriterien-API.

über die Antworten

Ich werde Gebrauch JPQL oder Criteria API benötigen, wenn Sie wissen, wie diese in SQL nur zu lösen, bitte einen Satz unabhängig von Datenbankanbietern zeigen (vielleicht in SQL: 2011), so Ich kann JPQL oder Criteria API übersetzen.

Antwort

0

Also kann es SQL oder kann es nicht sein? Hier sind einige SQL-Versionen die meisten sind für SQL-Server, aber ein paar wird für was auch immer funktionieren.

Eine Option, um einfach die Zeilen nach oben zu bewegen:

SELECT 
    visaoaplic0_.id_estabelecimento , 
    visaoaplic0_.embalagem_id   , 
    visaoaplic0_.rotulo_id   , 
    visaoaplic0_.nome_cidade   , 
    visaoaplic0_.nome_embalagem  , 
    visaoaplic0_.nome_estabelecimento , 
    visaoaplic0_.nome_estado   , 
    visaoaplic0_.preco    , 
    visaoaplic0_.tipo_estabelecimento, 
    visaoaplic0_.icone    , 
    visaoaplic0_.icone_content_type 
    ,RowNum = ROW_NUMBER() OVER (PARTITION BY visaoaplic0_.id_estabelecimento ORDER BY 
    IIF(visaoaplic0_.preco IS NULL,1,0) ASC 
    ,ISNULL(visaoaplic0_.preco,0) ASC 
    ) 
FROM visao_app_aba_locais visaoaplic0_ 
WHERE upper(visaoaplic0_.nome_cidade) = 'MONTES CLAROS' AND  upper(visaoaplic0_.nome_estado) = 'MINAS GERAIS' AND 
    (upper(visaoaplic0_.nome_estabelecimento) LIKE '%') AND 
    (visaoaplic0_.tipo_estabelecimento IN (1006, 1053, 1148, 1008, 1009, 1007)) AND 
    (visaoaplic0_.id_estabelecimento IS NOT NULL) 
ORDER BY 
    RowNum 
; 

Testdaten für die nächsten Abfragen

DECLARE @Table AS TABLE (Establishment VARCHAR(100), Price MONEY) 
INSERT INTO @Table (Establishment, Price) 
VALUES ('A',4.5),('B',5.5),('B',3.05),('C',6.75), ('D',NULL), ('C',NULL) 

Windowed Funktion mit Common Table Expression Umgang mit Null besser als einfach, wenn null vorhanden als erster Preis?

;WITH cteQuery AS (
    SELECT 
     * 
     ,RowNumber = ROW_NUMBER() OVER (PARTITION BY Establishment ORDER BY 
      IIF(Price IS NULL, 1, 0) ASC 
      ,ISNULL(Price,0) ASC) 
    FROM 
     @Table 
) 

SELECT 
    Establishment 
    ,Price 
FROM 
    cteQuery 
WHERE 
    RowNumber = 1 

Andere Optionen

----Windowed Function with Common Table Expression 
;WITH cteQuery AS (
    SELECT 
     * 
     ,RowNumber = ROW_NUMBER() OVER (PARTITION BY Establishment ORDER BY ISNULL(Price,0) ASC) 
    FROM 
     @Table 
) 

SELECT 
    Establishment 
    ,Price 
FROM 
    cteQuery 
WHERE 
    RowNumber = 1 


--- Group By with Common Table Expression Method 
;WITH cteMin AS (
    SELECT 
     Establishment 
     ,MinPrice = MIN(ISNULL(Price,0)) 
    FROM 
     @Table 
    GROUP BY 
     Establishment 
) 

SELECT 
    t.* 
FROM 
    cteMin m 
    INNER JOIN @Table t 
    ON m.Establishment = t.Establishment 
    AND m.MinPrice = ISNULL(t.Price,0) 



-----Group By with Sub Select Method 
SELECT 
    t.* 
FROM 
    @Table t 
    INNER JOIN (
     SELECT 
      Establishment 
      ,MinPrice = MIN(ISNULL(Price,0)) 
     FROM 
      @Table 
     GROUP BY 
      Establishment 
    ) g 
    ON t.Establishment = g.Establishment 
    AND ISNULL(t.Price,0) = g.MinPrice 
+0

Die Antwort in SQL sein kann, aber ich werde es in JPQL oder Criteria Query-Transformation benötigen, diese Weise Abfragen spezifisch für eine Datenbank wird nicht helfen. – brevleq