2012-08-09 299 views
4

一列中選擇值我有一個表像這樣基於優先級

 
AMID  Entry 
------- --------- 
1000  MARS 
1001  JUPITER 
1002  SATURN 
1003  VENUS 
1003  SATURN 
1004  NEPTUNE 
1004  SATURN 
1005  JUPITER 
1005  MARS 

現在我想提取DISTINCT AMID特別ENTRY值的值。 茶几應該是這樣的

 
AMID  Entry 
-------- -------- 
    1000 MARS 
    1001 JUPITER 
    1002 SATURN 
    1003 VENUS 
    1004 SATURN 
    1005 MARS 

選擇項值,則條件,

它採取基於這個優先的價值觀:

  1. VENUS
  2. MARS
  3. JUPITER
  4. SATURN
  5. NEPTUNE

所以如果有任何阿米德已經金星和火星都,它應該冒金星
火星和土星,它應該採取MARS
海王星和木星,它應該採取JUPITER。(按優先級選擇)。

+0

MySql或Sql Server? – 2012-08-09 09:25:59

+1

這是功課嗎? – podiluska 2012-08-09 09:30:09

+0

@ Podiluska:沒有配偶:) – harry 2012-08-09 09:57:39

回答

3

你可以用排序函數做到這一點(如果你使用SQL Server 2008):

DECLARE @t TABLE (AMID INT, Entry VARCHAR(100)) 
INSERT @t 
VALUES 
(  1000     ,'MARS'), 
(  1001     ,'JUPITER'), 
(  1002     ,'SATURN'), 
(  1003     ,'VENUS'), 
(  1003     ,'SATURN'), 
(  1004     ,'NEPTUNE'), 
(  1004     ,'SATURN'), 
(  1005     ,'JUPITER'), 
(  1005     ,'MARS') 

;WITH a AS(
    SELECT *, 
      ROW_NUMBER() OVER (PARTITION BY AMID ORDER BY 
       CASE Entry 
        WHEN 'VENUS' THEN 0 
        WHEN 'MARS' THEN 1 
        WHEN 'JUPITER' THEN 2 
        WHEN 'SATURN' THEN 3 
        WHEN 'NEPTUNE' THEN 4 
       END) num 
    FROM @t 
) 

SELECT AMID, Entry 
FROM a 
WHERE num = 1 
+4

很好的答案。我做了一個SQL小提琴鏈接這個http://sqlfiddle.com/#!3/d41d8/3207 – MakkyNZ 2012-08-09 09:44:38

+0

@MakkyNZ謝謝:) – 2012-08-09 10:03:33

1

試試這個MySQL查詢:

SELECT AMID, (CASE MIN(Entry) WHEN 1 THEN "VENUS" 
           WHEN 2 THEN "MARS" 
           WHEN 3 THEN "JUPITER" 
           WHEN 4 THEN "SATURN" 
           WHEN 5 THEN "NEPTUNE" 
       END) AS Entry 
FROM (
     SELECT AMID, (CASE Entry WHEN "VENUS" THEN 1 
           WHEN "MARS" THEN 2 
           WHEN "JUPITER" THEN 3 
           WHEN "SATURN" THEN 4 
           WHEN "NEPTUNE" THEN 5 
        END) AS Entry 
     FROM table_name 
    ) a 
GROUP BY AMID; 
3

試試這個:

;WITH CTE AS (
SELECT *,ROW_NUMBER() OVER(PARTITION BY AMID ORDER BY T.PRIORITY) AS ROWNUM 
FROM PLANETS P 
JOIN 
    (
    SELECT 1 PRIORITY, 'VENUS' AS NAME UNION ALL 
    SELECT 2, 'MARS' UNION ALL 
    SELECT 3, 'JUPITER' UNION ALL 
    SELECT 4, 'SATURN' UNION ALL 
    SELECT 5, 'NEPTUNE')T 
ON T.NAME=P.[ENTRY] 
)SELECT AMID,[ENTRY] FROM CTE WHERE ROWNUM=1 

SQL Fiddle demo

1

你爲什麼不乾脆把項值在自己的表:

CREATE TABLE entry_value 
(
    entry VARCHAR(10) NOT NULL PRIMARY KEY, 
    value INT NOT NULL 
); 

INSERT INTO entry_value VALUES 
    ('VENUS', 0), 
    ('MARS', 1), 
    ('JUPITER', 2), 
    ('SATURN', 3), 
    ('NEPTUNE', 4)  
; 

然後找到你想要的東西很簡單:

SELECT 
    a.amid, 
    (SELECT entry FROM entry_value where value = MIN(e.value)) AS entry 
FROM amid a 
JOIN entry_value e 
ON e.entry = a.entry 
GROUP BY a.amid 
ORDER BY a.amid; 

而作爲額外的獎勵,你可以添加一個外鍵入口欄,所以人們不能把像1000, 'PLUTO'這樣的垃圾放在那裏。

+0

謝謝隊友:) – harry 2012-08-09 09:59:07