2017-10-06 44 views
2

我發現了一個很好的解決方案來返回多列的最大值(SQL MAX of multiple columns?)。見下文。它適用於我的應用程序,但我不知道如何在[MaxDate]值上運行WHERE。我似乎無法確定我們的專欄名稱。在最大值多列上使用SQL WHERE子句

SELECT [Other Fields], 
    (SELECT Max(v) 
    FROM (VALUES (date1), (date2), (date3),...) AS value(v)) as [MaxDate] 
FROM [YourTableName] 
WHERE [MaxDate] = '2016-01-01' <---I know this is wrong but need help 
+0

哪個[DBMS]( https://en.wikipedia.org/wiki/DBMS)產品您使用? Postgres的?甲骨文? 「_SQL_」只是一種查詢語言,而不是特定數據庫產品的名稱。 –

回答

2

可以使用CROSS APPLY爲獲得最大的日期,而不是在SELECT使用子查詢,這樣你有可用於WHERE條件MaxDate柱:

SELECT [Other Fields], MaxDate 
FROM YourTableName 
CROSS APPLY (SELECT Max(v) 
    FROM (VALUES (date1), (date2), (date3), [...]) AS value(v)) 
    AS Dates (MaxDate) 
WHERE MaxDate='2016-01-01' 
+0

謝謝阿爾伯託......這正是我所尋找的,它的工作原理。現在我可以使用WHERE條件了! –

+0

對於SELECT中的每一行,這裏不會有CROSS APPLY運行嗎?我會查看關於此的查詢計劃並確保它可以擴展。對於來自的大數據集,這可能會變慢。 – Shawn

+0

@Shawn我不確定在這種情況下如何處理CROSS APPLY',但是替代方法是直接在'SELECT'列表中運行查詢,並且這種情況幾乎可以肯定地處理每行。如果提供相同的性能,則是最壞的情況)。 –

2

SELECT中的字段在WHERE之前不存在。在https://blog.sqlauthority.com/2009/04/06/sql-server-logical-query-processing-phases-order-of-statement-execution/高峯。

SQL的正常處理順序是:

  1. FROM
  2. ON
  3. OUTER
  4. WHERE
  5. GROUP BY
  6. CUBE | ROLLUP
  7. HAVING
  8. 選擇
  9. DISTINCT 10 ORDER BY
  10. TOP

所以在您的查詢,不存在[的maxDate]產品尚未推出。要有一個用於WHERE,請使用CTE生成一個。然後應用WHERE。

注意:爲簡單起見,我使用INT的VALUE()列。

SQL Fiddle

的MS SQL Server 2014架構設置

CREATE TABLE t (field1 varchar(10), f2 int, f3 int, f4 int) ; 

INSERT INTO t (field1, f2, f3, f4) 
VALUES ('first',10,5,0), ('second',1,7,3), ('third',2,4,6) ; 

查詢1

; WITH a AS (
    SELECT field1, 
    (
     SELECT Max(v) 
     FROM (VALUES (f2), (f3), (f4)) AS value(v) 
    ) AS maxF 
    FROM t 
) 
SELECT a.field1, a.maxF 
FROM a 
WHERE a.maxF = 6 ; 

Results

| field1 | maxF | 
|--------|------| 
| third | 6 | 
+0

Shawn,感謝您的回覆,但我想我在SQL中確實不太好,看看如何將其應用到我當前的查詢中。與我提供的示例相比,我目前的查詢要複雜得多。我更新了我的SQL代碼來說明我的問題在哪裏。謝謝。 –

+2

他的建議是,您將現有查詢(作爲CTE)嵌入到另一個查詢中,該查詢將所有數據通過,但是應用了「WHERE」,而不是「WHERE」子句。他的'maxF = 6'是你的'MaxDate ='2016-01-01''。 –