5

我有一张这样的桌子

AMID 入口
-------- ---------
1000 火星
1001木星
1002 土星
1003 金星
1003 土星
1004 海王星
1004 土星
1005 木星
1005火星

现在我想提取具有特定 ENTRY 值的 DISTINCT AMID 值。茶几应该是这样的

AMID 入口
-------- --------
  1000 火星
  1001木星
  1002 土星
  1003 金星
  1004 土星
  1005火星

选择 ENTRY 值的条件是,

它必须基于此优先级获取值:

  1. 金星
  2. 火星
  3. 木星
  4. 土星
  5. 海王星

所以如果任何一个AMID同时有金星和火星,它应该取金星
火星和土星,它应该取火星
海王星和木星,它应该取木星。(按优先级选择)。

4

4 回答 4

4

您可以使用排名函数来做到这一点(如果您使用的是 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
于 2012-08-09T09:37:00.723 回答
4

试试这个:

;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 演示

于 2012-08-09T09:38:59.233 回答
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;
于 2012-08-09T09:27:32.067 回答
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'在里面放垃圾了。

于 2012-08-09T09:46:47.170 回答